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

私は自分のDBで約12,000アイテムを更新しなければならない状況に陥っています。 各行は以前作成したExcelファイルをミラーリングする必要があります。 SQLステートメントの各行を作成するファイルを作成しましたが、1つのクエリで各行を実行できるかどうかはわかりません。

これは私がやろうとしていることの一例です。

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'

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

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

前もって感謝します

10

6 答え

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

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

それ以外にも、複数の更新プログラムを実行することが最善の方法です。

18
追加された
@BassamMehanni私は理解する。私は、 case を使って、更新ステートメントの数を減らす限り、おそらく彼ができる最善の方法であることを指摘していました。
追加された 著者 Icarus,
彼は12,000のユニークな値を更新しようとしていますが、ここではCaseが有効なオプションではないと思います
追加された 著者 Bassam Mehanni,

はい、1行のUpdate文をすべて1つのクエリに追加することができます。

8
追加された

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
追加された

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

For information on how to import Excel sheet into SQL: http://msdn.microsoft.com/en-us/library/ms141209.aspx

update文は次のようになります。

UPDATE itemTable
SET F1301 = excelTable.
FROM [STORESQL].[dbo].[RPT_ITM_D] itemTable inner join [STORESQL].[dbo].[importedExcelTableName] excelTable on itemTable.F01 = excelTable.

これが安全に機能するかどうか不明な場合は、単純な追加によって単一の値に対してこのクエリを試すことができます。

WHERE itemTable.F01 = '0000000000001'
2
追加された

大量のデータを更新する場合は、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
追加された

Excelの連結機能を使用してクエリをフレーム化することができます。実行する必要があるのは、単一の更新クエリをフレーム化し、残りのクエリをドラッグするだけです

連結する( "Update set =" , "、where = ","; ")

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

1
追加された