单个查询中的多个SQL更新语句
我处于需要更新我的数据库中大约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'
这项工作,还是有什么更好的选择,我想实现?
每个项目都有一个唯一的值,并且要更改的列也具有唯一值。我没有看到我可以如何使用循环或我迄今发现的其他任何方法来完成此项工作。我意识到这可能需要很长时间来处理,但时间不是问题。
预先感谢您
是的,你可以像你一样在一个查询中添加所有单行更新语句。
像这样的东西是你能做的最好的: - 比
UPDATE [STORESQL].[dbo].[RPT_ITM_D]
SET F1301 =
case F01
when '0000000000001' then '1.29'
when '0000000000002' then '1.30'
end
其他,运行多个更新是要走的路。
如果您有大量数据需要更新,那么将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很快地加载文件。
我认为最好的办法是将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'
在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;
您可以在Excel中使用串连功能来构建查询,所有你需要做的是帧中的单个更新查询并拖动同为其余
串连(“更新设置=” “”,其中= “,,”;“)
使用上面的格式并拖动单元格直到结束,或者双击右下角的自动填充Update语句。我相信这是尽可能最短的方式,并在单个Go中运行。
他正在尝试更新12,000个唯一值,我不认为Case是这里的有效选项 – 2012-02-06 16:38:06
@BassamMehanni我明白。我只是指出,尽量减少更新语句的数量,使用'case'可能是他能做的最好的。 – Icarus 2012-02-06 16:41:18