sql - 我可以清理这个 XML 查询吗?

标签 sql sql-server xml

这是我当前使用的查询:

DECLARE @Index AS INT
SET @Index = 1
SELECT
  auditId,
  parameters.value('(params/param[position()=sql:variable("@Index")]/node())[1]', 'nvarchar(256)') AS value,
  parameters.value('(params/param[position()=sql:variable("@Index")]/@entityId)[1]', 'nvarchar(256)') AS entityId,
  parameters.value('(params/param[position()=sql:variable("@Index")]/@entityType)[1]', 'bigint') AS entityType,
  parameters.value('(params/param[position()=sql:variable("@Index")]/@localizable)[1]', 'bit') AS localizable
FROM
  audit

我的审计表包含一个参数 XML 节点,如下所示: 用户名 计算机名

我想知道是否有办法摆脱多余的 parameters.value('(params/param[position()=sql:variable("@Index")]部分并可能将其作为联接来执行?

最佳答案

您可以使用交叉应用来简化一点。

SELECT
  auditId,
  T.N.value('.', 'nvarchar(256)') AS value,
  T.N.value('@entityId', 'nvarchar(256)') AS entityId,
  T.N.value('@entityType', 'bigint') AS entityType,
  T.N.value('@localizable', 'bit') AS localizable
FROM audit
  CROSS APPLY parameters.nodes('/params/param[sql:variable("@Index")]') AS T(N)

关于sql - 我可以清理这个 XML 查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11846883/

相关文章:

python - 传递空列表时 SQL 查询 ( select ) 中的语法错误

c# - 从 NHibernate 调用存储过程并检索 @@ROWCOUNT

mysql - 将 SQL 链接到 Access,重新查询显示 #Deleted

sql - 为多个分层组优化 SUM OVER PARTITION BY

mysql - MySQL 是否更新所有插入的索引?我可以在每次插入 x 后更新它吗?

sql - 为什么我的 As400 无法从新创建的成员别名中进行选择?

android - 将两个并排的 ImageView 居中

java - jaxb可以生成这样的xml模式吗?

xml - 使用 XPath 函数 fn :replace from XSLT

java - JOOQ 选择与组不同的计数