单个查询中的多个SQL Update语句
我现在的情况是,我必须更新数据库中大约12000个项目。 每一行都需要镜像我以前创建的excel文件。 我已经创建了创建SQL语句每一行的文件,但我不确定是否可以在单个查询中运行每一行 这是我正在尝试做的一个例子单个查询中的多个SQL Update语句,sql,sql-update,Sql,Sql Update,我现在的情况是,我必须更新数据库中大约12000个项目。 每一行都需要镜像我以前创建的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='
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
除此之外,运行多个更新是最好的选择 是的,您可以像现在这样在一个查询中添加所有单行Update语句。如果您有大量数据要更新,最好将excel文件作为表加载到数据库中,然后根据加载的表中的数据更新表
UPDATE RPT_ITM_D
SET F1301 = NewTable.Value
FROM RPT_ITM_D INNER JOIN NewTable ON (NewTable.F01 = RPT_ITEM_D.F01);
如果您使用的是SQL server,则可以使用SSIS快速加载文件。我认为最好的方法是将Excel工作表导入SQL数据库中的表中。从那里,您可以使用连接为所有12000个项目创建单个更新语句 有关如何将Excel工作表导入SQL的信息: 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>
看一看,例如:
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;
…但以这种方式使用表值构造函数将无法扩展到12000行!因此,首先将数据从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中的concatenate函数来框显查询,您只需框显单个更新查询,并将其拖动到其余查询即可 连接(“更新集=,”,其中= “,;”)
使用上述格式并拖动单元格直到结束,或者双击右下角以自动填充Update语句。我相信这是最短的方法,可以一次性运行。他正在尝试更新12000个唯一值,我认为Case不是一个有效的选项here@BassamMehanni我理解。我刚刚指出,就减少update语句的数量而言,使用
case
可能是他能做的最好的方法。
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;