2012-02-06 5 views
9

自分のDBで約12,000個の項目を更新する必要がある状況です。 各行は以前作成したExcelファイルをミラーリングする必要があります。 SQL文の各行を作成するファイルを作成しましたが、1つのクエリで各行を実行できるかどうかはわかりません。単一のクエリで複数のSQL更新文

これは私が何をしようとしているのかの例です。

UPDATE [STORESQL].[dbo].[RPT_ITM_D] SET F1301='1.29' WHERE F01='0000000000001' 
UPDATE [STORESQL].[dbo].[RPT_ITM_D] SET F1301='1.39' WHERE F01='0000000000002' 

これはうまくいくのでしょうか、それとも達成しようとしている選択肢がありますか?

各項目には一意の値が設定され、変更する列にも一意の値が設定されます。私はループやこれまでに見つけた方法でこの作業をどうやって行えるのか分かりません。これは処理に時間がかかるかもしれないことに気づいていますが、時間は問題ではありません。

は、このような

答えて

8

はい、実行中のように、すべての1行のUpdate文を1つのクエリに追加できます。

16

何かがあなたができる最善である、事前にありがとう: - それ以外は

UPDATE [STORESQL].[dbo].[RPT_ITM_D] 
SET F1301 = 
     case F01 
     when '0000000000001' then '1.29' 
     when '0000000000002' then '1.30' 
end 

、複数の更新を実行すると、移動するための方法です。

+3

彼は12,000のユニークな値を更新しようとしていますが、私はケースが有効なオプションではないと考えています –

+0

@BassamMehanni私は分かります。私は、更新ステートメントの数を減らす限り、 'case'を使用することがおそらく彼ができる最善の方法であることを指摘していました。 – Icarus

1

大量のデータを更新する場合は、Excelファイルをテーブルとしてデータベースにロードし、このロードされたテーブルのデータに基づいてテーブルを更新すると便利です。

UPDATE RPT_ITM_D 
     SET F1301 = NewTable.Value 
    FROM RPT_ITM_D INNER JOIN NewTable ON (NewTable.F01 = RPT_ITEM_D.F01); 

あなたはSQLサーバーを使っているのであれば、あなたはかなり迅速にファイルをロードするためにSSISを使用することができます。

2

私は、SQLデータベースのテーブルにExcelシートをインポートすることをお勧めします。そこから、結合を使用してすべての12,000項目の単一の更新ステートメントを作成できます。 UPDATE文は、このようなものになりますhttp://msdn.microsoft.com/en-us/library/ms141209.aspx

:SQLにExcelシートをインポートする方法については

あなたはこれが安全に作業するかどうかわからない場合

UPDATE itemTable 
SET F1301 = excelTable.<column with your value> 
FROM [STORESQL].[dbo].[RPT_ITM_D] itemTable inner join [STORESQL].[dbo].[importedExcelTableName] excelTable on itemTable.F01 = excelTable.<column with the item code> 

を、あなたは

WHERE itemTable.F01 = '0000000000001' 
2

MERGEなどを見てみましょう:シンプル追加することにより、単一の値のために、このクエリを試すことができます

MERGE INTO [STORESQL].[dbo].[RPT_ITM_D] 
    USING (
      VALUES ('1.29', '0000000000001'), 
       ('1.39', '0000000000002') 
     ) AS source (F1301, F01) 
    ON F01 = source.F01 
WHEN MATCHED THEN 
    UPDATE 
     SET F1301 = source.F1301; 

...このようにテーブル値コンストラクタを使用すると、12,000行に拡大されません!最初にExcelのデータをサーバー上のテーブルにコピーしてから、そのテーブルをソースとして使用してください。

MERGE INTO [STORESQL].[dbo].[RPT_ITM_D] 
    USING [STORESQL].[dbo].MyStagingTable AS source 
     ON F01 = source.F01 
WHEN MATCHED THEN 
    UPDATE 
     SET F1301 = source.F1301; 
0

あなたはあなたがする必要があるのは、単一の更新クエリをフレームと、残り

CONCATENATE(「更新セット=」のために同じことをドラッグすることで、クエリをフレームにExcelでCONCATENATE関数を使用することができます,,「= 」,,「;」)

上記の形式を使用して自動UPDATE文の記入のための右下隅の端またはダブルクリックまでのセルをドラッグします。私は可能な限り最短の方法であり、単一のGoでそれを実行することを信じています。