【发布时间】:2012-12-14 12:10:09
【问题描述】:
你好!
今天我学习了for xml path在mssql中连接字符串的技术。由于我从未在 mssql 中使用过 xml,而 google 也没有帮助,所以我需要问你。
让我们想象一下默认情况。我们需要连接表格中的一些字符串:
declare @xmlRepNames xml = (
select
', [' + report_name + ']'
from (
select distinct
report_order,
report_name
from #report
) x
order by
report_order
for xml path(''), type)
select
stuff((select @xmlRepNames.value('.', 'nvarchar(max)')), 1, 1, '')
所以我是这样的:
[str1], [str2], [strn]
好的。它工作正常。但我有两个非常相似的连接块。不同之处在于结果字符串的样子:
-
[str1], [str2], [strn]
和 isnull([str1], 0) as [str1], isnull([str2], 0) as [str2], isnull([strn], 0) as [strn]
所以我可以使用不同的字符串构造函数编写 2 个非常相似的代码块(已经完成,顺便说一句),或者尝试将以前的代码扩展为包含 2 种构造函数的 xml 变量,然后通过 xml 节点类型连接。第二种方式我遇到了一些问题 - 我写了这个:
declare @xmlRepNames xml = (
select
', [' + report_name + ']' as name,
', isnull([' + report_name + '], 0) as [' + report_name + ']' as res
from (
select distinct
report_order,
report_name
from #report
) x
order by
report_order
for xml path(''), type)
select
stuff((select @xmlRepNames.value('/name', 'nvarchar(max)')), 1, 1, ''),
stuff((select @xmlRepNames.value('/res', 'nvarchar(max)')), 1, 1, '')
但它会引发错误"XQuery [value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'"。
要替换,例如,'/name' 到 '/name[1]' 或任何其他 '/name[x]',将只返回第 x 个“名称”记录,但不是所有连接的“名称”记录。
[问题]:是否可以像我想要的那样以第二种方式解决问题,如果可以,那么如何解决?
[免责声明]:问题是'现在对我来说真的不是很严重(第一种方式有点丑但也很好),但是如何过来似乎很有趣:)
谢谢!
【问题讨论】:
标签: sql sql-server-2008 string-concatenation for-xml-path