sql-server - 使用 XML 更新 SQL Server 表

标签 sql-server xml xquery

我有一个如下所示的 XML 变量:

<code>
<IDs>
    <ID id="1">a</ID>
    <ID id="43">d</ID>
    <ID id="3">b</ID>

</IDs>
</code>

我想在将更新表的存储过程 (SQL Server) 中使用它。

我的表格是这样的:

ID INT,
a INT,
b INT,
c INT,
d INT

该语句应增加与 id 关联的字母值。

所以它看起来像这样:

Table Row with ID = 1, update column "a" by increasing the current value by 1.
Table Row with ID = 43 - update column "d" by increasing current value by 1.
Finally Table row with ID= 3 - update column "b" by increasing value by 1.

这是我目前所拥有的 - (第二行是我最需要帮助的地方。):

Update MyTable
SET @letter = letterVal +1
WHERE ID IN(
SELECT x.v.value('@id','INT')
FROM @xmlIDs.nodes('/IDs/ID') x(v)
)

最佳答案

您必须按照以下方式做一些事情:

DECLARE @input XML = '<code>
<IDs>
    <ID id="1">a</ID>
    <ID id="43">d</ID>
    <ID id="3">b</ID>

</IDs>
</code>'

;WITH ParsedXML AS
(
SELECT
    ID = C.value('(@id)[1]', 'int'),
    ColumnName = C.value('(.)[1]', 'varchar(10)')
FROM @Input.nodes('/code/IDs/ID') AS T(C)
)
UPDATE MyTable 
SET a = CASE WHEN p.ColumnName = 'a' THEN t.a + 1 ELSE t.a END,
    b = CASE WHEN p.ColumnName = 'b' THEN t.b + 1 ELSE t.b END,
    c = CASE WHEN p.ColumnName = 'c' THEN t.c + 1 ELSE t.c END,
    d = CASE WHEN p.ColumnName = 'd' THEN t.d + 1 ELSE t.d END
FROM MyTable t
INNER JOIN ParsedXml p ON t.ID = p.ID

SELECT * FROM Mytable

这样就可以了——但它真的很难看。主要问题是:您无法从其他地方获取列名作为值,以便在 UPDATE 语句中使用它 - 除非您采用动态 SQL 路由,它有其自身的优点和缺点并且会变得相当困惑。

如果您对动态 SQL 感兴趣 - The Curse and Blessings of Dynamic SQL Erland Sommarskog 的绝对必读 - 在开始使用动态 SQL 之前阅读!

关于sql-server - 使用 XML 更新 SQL Server 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11528393/

相关文章:

c# - 设计模式/想法根据触发器将执行的操作刷新网格中的行

xml - 从 XML 返回元素的第一个属性

c# - 如何知道在C#代码中具有TRY CATCH处理的存储过程中是否存在错误

javascript - 使用 XML 作为内容管理系统(嵌入到 HTML 文档中)

xml - 编写更高效的 xquery 代码(避免冗余迭代)

xml - xPath 检索多个值

java - XQUERY JAVA 不工作

xslt - xpath 表达式依赖于 sibling

sql - 自定义处理以在 SQL 中将行转换为列

sql-server - SSIS 包是否失败,当其中一个容器失败时