Einfügen für jede Zeile aus einer Auswahl durchführen?

73

Ich habe eine Reihe von Datensätzen, die ich in mehrere Tabellen einfügen muss. Jede zweite Spalte ist eine Konstante.

Schlechter Pseudocode unten - das möchte ich tun:

create table #temp_buildings
(
    building_id varchar(20)
)
insert into #temp_buildings (building_id) VALUES ('11070')
insert into #temp_buildings (building_id) VALUES ('11071')
insert into #temp_buildings (building_id) VALUES ('20570')
insert into #temp_buildings (building_id) VALUES ('21570')
insert into #temp_buildings (building_id) VALUES ('22570')

insert into property.portfolio_property_xref
        ( portfolio_id ,
          building_id ,
          created_date ,
          last_modified_date
        )
values
        ( 
            34 ,
            (
                select  building_id
                from    #temp_buildings
            ) ,
            getdate() ,
            null
        )

Absicht: Führen Sie für jeden Datensatz in #temp_buildings eine Einfügung in property.portfolio_property_xref durch

Ich denke, ich könnte dies mit einem Cursor tun - aber ich glaube, das wäre schrecklich langsam. Da diese Übung in Zukunft wiederholbar sein wird, würde ich dies lieber schneller angehen, bin mir aber nicht sicher, wie. Jedes Feedback wäre dankbar!

Michael A.
quelle
1
Tipp: Sie können auch insert into #temp_buildings (building_id) VALUES ('11070'), ('11071'),...mehrere Zeilen einfügen.
HABO
@Habo Netter - schneide einfach gut 50 Zeilen aus meinem Skript :) Danke
Michael A

Antworten:

142
INSERT INTO table1 ( column1 )
SELECT  col1
FROM    table2

Mögen:

insert into property.portfolio_property_xref
( 
    portfolio_id ,
    building_id ,
    created_date ,
    last_modified_date
)
select
    34,
    building_id,
    getdate(),
    null
from
    #temp_buildings
Justin Skiles
quelle
8
Eck. Es ist mir peinlich, wenn es so einfach ist :)
Michael A
Aber dort ist es auf 1000 Zeilen proinsert into select from
21.
@procma Ich glaube nicht, dass das stimmt. Hast du irgendwelche Beweise?
Justin Skiles
Entschuldigung, Sie haben Recht, nicht in der Tabelle-zu-Tabelle-Einfügung, sondern definitiv in der "manuellen" Batch-zu-Tabelle-Einfügung INSERT INTO table1 (ID, Col1) VALUES (123, 'abc'), (124, 'def'), (125, 'ghi'). Dort können Sie nur 1000 Wertgruppen haben
Procma
7

Sie möchten verwenden INSERT INTO SELECT FROM(siehe SQL Fiddle mit Demo )

insert into property.portfolio_property_xref
( 
    portfolio_id ,
    building_id ,
    created_date ,
    last_modified_date
)
SELECT 34 ,
       building_id,
       getdate(),
       null
from    #temp_buildings
Taryn
quelle
2

Ein bisschen zufällig, aber ich denke, dass dies für jeden nützlich sein kann, der hierher kommt, um diese Frage zu beantworten. Manchmal verwende ich Microsoft Excel VBA, um Teile von SQL-Anweisungen wie oben aufgeführt zu generieren. Ich finde das sehr nützlich, wenn ich mich in Situationen befinde, in denen ich Tabellenkonstruktionen und Datentransformationen durchführe, um einen neuen Job einzurichten. Dies ist ein wirklich einfaches Beispiel. Es wurde eine Verbindung zwischen zwei getrennten, nicht verwandten Systemen hergestellt. Dann erlaubte mir der Link, eine neue Tabelle in einer Lagerumgebung zu erstellen, die drei nicht verwandte Systeme miteinander verband. Auf jeden Fall konnte ich in Sekundenschnelle> 5000 SQL-Zeilen (für den einmaligen Gebrauch - und einen kleinen Teil einer viel größeren ETL-Aufgabe) erstellen.

Option Explicit

Dim arow As Integer
Dim acol As Integer
Dim lrow As Integer
Dim IsCellEmpty As String
Dim CustNo As Integer
Dim SkuLevel As Integer


Sub SkuLevelUpdate()

'find end ouf input file
arow = 1
acol = 1

Do
    IsCellEmpty = Cells(arow, acol).Value
    arow = arow + 1
Loop Until IsCellEmpty = ""

lrow = arow - 1

'Write SQL
arow = 2
acol = 5

Do
    CustNo = Cells(arow, 1)
    SkuLevel = Cells(arow, 4)
    Cells(arow, acol) = "INSERT INTO dbo.#TempSkuLevelRelationships (CustNo, SkuLevel) VALUES (" & CustNo & ", " & SkuLevel & ");"
    arow = arow + 1
Loop Until arow = lrow

End Sub

Ja, ich weiß alles über SQL-Injection usw. Ich erstelle die Tabelle (n), kopiere die Daten in einen größeren SQL-Code, um sie neu zu erstellen, Tabellen zu ändern und dergleichen, wenn sich die Daten derzeit nicht in einer SQL-Tabelle befinden

Jon Milliken
quelle
0

Versuche dies

   insert into property.portfolio_property_xref
   ( 
      portfolio_id ,
      building_id ,
      created_date ,
      last_modified_date
   )
   Select
      34,
      building_id,
      GETDATE(),
      NULL
   From #temp_buildings
Codingbiz
quelle
0

Sie sagen, dass Sie es mit einem Cursor tun können. Wie die anderen Antworten zeigen, müssen Sie dies nicht tun. SQL Server ist ein satzbasiertes RDMS. Es kann eher einen Datensatz als einzelne Zeilen verarbeiten.

Mark Kremers
quelle