web-dev-qa-db-ja.com

1つのクエリに複数のSQL更新ステートメント

私のDBで約12,000のアイテムを更新しなければならない状況にあります。各行は、以前に作成したExcelファイルをミラーリングする必要があります。 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'

これはうまくいきますか、それとも私が達成しようとしていることのためのより良いオプションはありますか?

各アイテムには一意の値があり、変更される列にも一意の値があります。これをループや、これまでに見つけた他のメソッドでどのように機能させることができるのかわかりません。これには処理に時間がかかるかもしれませんが、時間は問題になりません。

前もって感謝します

11
Erick Ely

はい、行っているように、1つのクエリですべての単一行のUpdateステートメントを追加できます。

10
Bassam Mehanni

このような何かがあなたができる最高です:-

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

それ以外は、複数のアップデートを実行するのがよいでしょう。

20
Icarus

ExcelシートをSQLデータベースのテーブルにインポートするのが最善の方法だと思います。そこから、結合を使用して、12,000項目すべてに対して単一の更新ステートメントを作成できます。

ExcelシートをSQLにインポートする方法の詳細: http://msdn.Microsoft.com/en-us/library/ms141209.aspx

更新ステートメントは次のようになります。

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
F43G4N

[〜#〜] 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;
2
onedaywhen

更新するデータが大量にある場合は、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を使用してファイルを非常にすばやくロードできます。

1
N West

Excelの連結関数を使用してクエリをフレーム化できます。必要なのは、単一の更新クエリをフレーム化し、残りを同じようにドラッグすることだけです。

concatenate( "更新セット=" , "、where =" , ";")

上記の形式を使用してセルを最後までドラッグするか、右下隅をダブルクリックしてUpdateステートメントの自動入力を行います。私はこれが可能な限り最短の方法であると考え、単一のGoで実行します。

1
Arka Kahali