首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理SQL更新

处理SQL更新
EN

Stack Overflow用户
提问于 2022-11-01 18:21:08
回答 1查看 47关注 0票数 0

我有一个表名、Id、列名和值,我需要将这些表作为更新运行到Azure SQL数据库中。

由于更新的列不同,表都是不同的。

我能想到的唯一方法是RBAR,但是必须有一种更简单的方法来处理这个问题,要么是SQL,要么是数据工厂?

数据的例子是:

代码语言:javascript
复制
Table Name    Id    Column Name    Value
Table 1       1234  column1        1
Table 1       1234  column2        2022-01-02
Table 2       4321  column6        2144
Table 2       4321  column12       2022-01-02

列名可以是表中任何具有update值的列。

如前所述,我已经通过痛苦的行来尝试行,但是,正如您所预期的,这太痛苦了,因为我有大约161 K的行需要处理。

EN

回答 1

Stack Overflow用户

发布于 2022-11-01 19:27:45

您需要为每一行构建一个SQL字符串,并按照自己的命令运行该字符串。

作为其中的一部分,我要做的一件事是从Information_Schema.Columns中提取表/列信息。这将给您提供您已经拥有的相同的文本,但它确保(以安全的方式)源表中的数据确实是数据库中的有效对象,而不是SQL注入尝试。我还将使用sp_executesql进行最后一次查询,以便以安全的方式包含新值。

因此,主查询应该如下所示:

代码语言:javascript
复制
SELECT d.ID, d.Value,
    'UPDATE ' + QUOTENAME(c.Table_Name) + ' SET ' + QUOTENAME(c.Column_Name) + ' = @new_value WHERE ID= @RowID' as SQL 
FROM [MyData] d
INNER JOIN Information_Schema.Columns c ON c.[Table Name] = d.Table_Name
   AND c.[Column Name] = d.Column_Name 

然后循环取每一行并执行如下操作:

代码语言:javascript
复制
-- @SQL, @ID, and @Value from the row

Execute sp_executeSql @SQL, '@new_value varchar(50), @id int', @new_value = @Value, @RowID = @ID

我跳过了遍历行的部分,因为这里有许多选项,而哪种选项最好取决于您的特定情况:您想要游标吗?客户代码?很难知道。

诀窍是我们不知道新值的数据类型..。看起来你在里面混合了数据类型。例如,您知道,在varchar列中存储日期是非常糟糕的,对吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74280216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档