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!
sql
sql-server-2008
tsql
insert
Michael A.
quelle
quelle
insert into #temp_buildings (building_id) VALUES ('11070'), ('11071'),...
mehrere Zeilen einfügen.Antworten:
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
quelle
insert into select from
INSERT INTO table1 (ID, Col1) VALUES (123, 'abc'), (124, 'def'), (125, 'ghi')
. Dort können Sie nur 1000 Wertgruppen habenSie 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
quelle
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
quelle
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
quelle
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.
quelle