2012-02-06 88 views
9

我處於需要更新我的數據庫中大約12,000個項目的情況。 每一行都需要鏡像我以前製作的一個excel文件。 我已經創建了創建SQL語句的每一行的文件,但我不確定是否可以在單個查詢中運行每行。單個查詢中的多個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

是的,你可以像你一樣在一個查詢中添加所有單行更新語句。

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個唯一值,我不認爲Case是這裏的有效選項 – 2012-02-06 16:38:06

+0

@BassamMehanni我明白。我只是指出,儘量減少更新語句的數量,使用'case'可能是他能做的最好的。 – Icarus 2012-02-06 16:41:18

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

我認爲最好的辦法是將Excel工作表導入到SQL數據庫的表中。從那裏你可以使用連接爲所有12,000個項目創建一個更新語句。

有關如何導入Excel電子表格到SQL:http://msdn.microsoft.com/en-us/library/ms141209.aspx

update語句會再看看這樣的事情:

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

您可以在Excel中使用串連功能來構建查詢,所有你需要做的是幀中的單個更新查詢並拖動同爲其餘

串連(「更新設置=」 「」,其中= 「,,」;「)

使用上面的格式並拖動單元格直到結束,或者雙擊右下角的自動填充Update語句。我相信這是儘可能最短的方式,並在單個Go中運行。