单个查询中的多个 SQL 更新语句

Posted

技术标签:

【中文标题】单个查询中的多个 SQL 更新语句【英文标题】:Multiple SQL Update Statements in single query 【发布时间】:2012-02-06 15:40:43 【问题描述】:

我不得不更新数据库中的大约 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'

这会奏效吗,或者对于我想要实现的目标有更好的选择吗?

每个项目都将具有唯一值,要更改的列也将具有唯一值。我不知道如何使用循环或到目前为止我发现的任何其他方法来完成这项工作。我知道这可能需要很长时间来处理,但时间不是问题。

提前谢谢你

【问题讨论】:

【参考方案1】:

这样的事情是你能做的最好的事情:-

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

end

除此之外,运行多个更新是可行的方法。

【讨论】:

他正在尝试更新 12,000 个唯一值,我认为 Case 在这里不是一个有效的选项 @BassamMehanni 我明白了。我只是指出,就减少更新语句的数量而言,使用case 可能是他能做的最好的事情。 以防我的编辑未获得批准 - 请小心在 CASE 语句中没有 ELSE 的情况下运行它。任何未处理的都将设置为 NULL!【参考方案2】:

是的,您可以像现在这样在一个查询中添加所有单行更新语句。

【讨论】:

【参考方案3】:

我认为最好的方法是将 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'

【讨论】:

【参考方案4】:

看看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;

【讨论】:

【参考方案5】:

如果您有大量数据要更新,最好将 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 快速加载文件。

【讨论】:

【参考方案6】:

您可以使用 Excel 中的 concatenate 函数来构建查询,您需要做的就是构建单个更新查询并将其拖到其余部分

concatenate("更新集=",,",where = ",,";")

使用上述格式,将单元格拖到最后或双击右下角自动填充Update语句。我相信这是最短的方法,可以在一个 Go 中运行。

【讨论】:

【参考方案7】:

对 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);

【讨论】:

以上是关于单个查询中的多个 SQL 更新语句的主要内容,如果未能解决你的问题,请参考以下文章

如何在 DB2 的单个更新语句中更新多个列

是否可以使用单个 UPDATE SQL 语句执行多个更新?

在单个 oracle sql 语句中返回多个值

遇到产品时增加行号 - T SQL - 单个查询(不允许多个语句)

第九章 SQL查询数据库

第九章 SQL查询数据库