我遇到的情况是我需要更新数据库中的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'
这会起作用,还是有更好的选择来实现我的目标?
每个项目都有一个唯一值,要更改的列也将具有唯一值。我不知道如何用循环或我到目前为止找到的任何其他方法来完成这项工作。我意识到这可能需要很长时间才能完成,但时间不是问题。
提前谢谢
答案 0 :(得分:19)
这样的事情是你能做的最好的事情: -
UPDATE [STORESQL].[dbo].[RPT_ITM_D]
SET F1301 =
case F01
when '0000000000001' then '1.29'
when '0000000000002' then '1.30'
end
除此之外,还可以运行多个更新。
答案 1 :(得分:9)
是的,您可以在一个查询中添加所有单行Update语句,就像您正在做的那样。
答案 2 :(得分:2)
我认为最好的方法是将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'
答案 3 :(得分: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;
答案 4 :(得分: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很快加载文件。
答案 5 :(得分:1)
您可以使用Excel中的连接功能来构建查询,您需要做的就是构建单个更新查询并将其拖动到其余部分
连接(“Update set =”,,“,where = ” ,, “;”)
使用上述格式并将单元格拖到最后或双击右下角以自动填充Update语句。我相信这是最短的方式,并在一个Go中运行。
答案 6 :(得分:0)
对 F01 列进行唯一约束,然后使用带有“ON DUPLICATE KEY UPDATE”语句的插入语句。
INSERT INTO [STORESQL].[dbo].[RPT_ITM_D] (F01, F1301)
VALUES
('0000000000001','1.29'),
('0000000000002','1.39')
ON DUPLICATE KEY UPDATE F1301 = VALUES(F1301);