web-dev-qa-db-ja.com

選択から取得した各行に対して挿入を実行しますか?

複数のテーブルに挿入する必要があるレコードがいくつかあります。他のすべての列は定数になります。

下の貧しい擬似コード-これは私がやりたいことです:

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
        )

Intent: #temp_buildingsの各レコードに対してproperty.portfolio_property_xrefへの挿入を実行します

私はカーソルでこれを行うことができると思います-しかし、これは恐ろしく遅いと信じています。このエクササイズは将来再現可能になるので、より速い方法でこれに取り組むことをお勧めしますが、方法はわかりません。フィードバックをいただければ幸いです!

62
Michael A
INSERT INTO table1 ( column1 )
SELECT  col1
FROM    table2

好む:

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

INSERT INTO SELECT FROMを使用します( 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
6
Taryn

ランダムですが、この質問にここに来た人にはこれが役立つと思います。時々、Microsoft Excel VBAを使用して、上記のようなSQLステートメントの一部を生成します。これは、新しいジョブを設定するためにテーブルの構築とデータ変換を行っている状況にあるときに非常に役立ちます。これは本当に簡単な例です。 2つの独立した無関係なシステム間のリンクを作成しました。次に、このリンクにより、3つの無関係なシステムを結び付けたウェアハウス環境で新しいテーブルを作成できました。とにかく、数行で5000行以上のSQLを作成できました(1回限りの使用のために-さらに大きな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

はい、SQLインジェクションなどについてすべて知っています。スプレッドシートを作成し、データが現在SQLテーブルに存在しない場合、新しい構築、テーブル変更などのためにデータをコピーしてより大きなSQLコードに貼り付けます。

2
Jon Milliken

これを試して

   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
codingbiz

あなたはカーソルでそれができると言っています。他の答えが示すように、あなたはそれをする必要はありません。 SQL ServerはセットベースのRDMSであり、一連のデータを処理してから、単一行を処理することができます。

0
Mark Kremers