2012-08-01 16 views
39

Mam wiele rekordów, które należy wstawić do wielu tabel. Każda inna kolumna będzie stała.Wykonaj wstawianie dla każdego wiersza pobranego z wybierz?

Słabe pseudo kod poniżej - to jest to, co chcę zrobić:

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 
     ) 

zamiar: Wykonać wkładkę do property.portfolio_property_xref dla każdego rekordu na #temp_buildings

Myślę, że mógłbym zrobić to za pomocą kursora - ale wierzcie, że byłoby to strasznie wolne. Ponieważ ćwiczenie to będzie powtarzalne w przyszłości, wolałbym rozwiązać to szybciej, ale nie jestem pewien, jak to zrobić. Wszelkie opinie będą mile widziane!

+1

Wskazówka: Możesz również użyć 'wstaw do #temp_buildings (id_budynku) VALUES ('11070'), ('11071'), ...' aby wstawić wiele wierszy. – HABO

+0

@Habo Nice one - po prostu wyciąć dobre 50 wierszy z mojego skryptu :) Thank-you – Codingo

Odpowiedz

88
INSERT INTO table1 (column1) 
SELECT col1 
FROM table2 

odczuwalna:

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

Eck. Jestem zakłopotany, jeśli to takie proste :) – Codingo

+22

Nigdy nie wiadomo, dopóki nie zapytasz, prawda? –

0

Spróbuj

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

Będziemy chcieli wykorzystać INSERT INTO SELECT FROM (Patrz SQL Fiddle with 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 
0

Mówisz, że można to zrobić z kursorem. Jak pokazują inne odpowiedzi, nie musisz tego robić. SQL Server to oparty na zestawie RDMS, jest bardziej zdolny do przetwarzania zbioru danych, a następnie przetwarzania pojedynczych linii.

1

Rodzaj losowy, ale wydaje mi się, że może być przydatny dla każdego, kto przyjdzie tutaj na to pytanie. Czasami używam programu Microsoft Excel VBA do generowania części instrukcji SQL, takich jak wymienione powyżej. Uważam, że jest to bardzo przydatne, gdy jestem w sytuacjach, w których robię konstruowanie tabel i transformację danych, aby skonfigurować nową pracę. to naprawdę prosty przykład. Stworzyło łącze między 2 oddzielnymi niespokrewnionymi systemami. Następnie odsyłacz pozwolił mi zbudować nową tabelę w środowisku magazynowym, która łączyła 3 niepowiązane ze sobą systemy. W każdym razie pozwoliło mi stworzyć w ciągu kilku sekund> 5000 linii SQL (na jednorazowe użycie - i małą część znacznie większego zadania ETL).

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 

Tak, wiem wszystko o SQL injection, itp utworzyć arkusz (-y), skopiować/wkleić dane do większej kodu SQL dla nowej konstrukcji, modyfikacji stołu i tym podobne, gdy dane nie obecnie nie znajduje się w tabeli SQL

Powiązane problemy