我有一个临时表。此表的列数和列名可以有所不同。因为此临时表是从另一个查询生成的。意思是它可以是3-15。我使用以下命令从临时表中获取XML:
DECLARE @XML XML
SET @XML= (SELECT * FROM ##temp FOR XML PATH(''))
示例输出:<Name>abc</Name><ID>3</ID><Address>100/8 NY</Address>
现在我希望标签名称及其对应的值成为@variable,比如@StoreData。
说select @StoreDate
将打印以下预期输出
预期产出:
姓名='abc'且ID ='3'且地址='100/8 NY'
我是怎么做到的。提前致谢。 注意:我使用的是MS SQL 2005版
答案 0 :(得分:3)
这符合您的要求......
;with cte as
(
select
xr.value('fn:local-name(.)','varchar(50)') name,
xr.value('.','varchar(20)') val
from @xml.nodes('//.') xq(xr)
where xr.value('fn:local-name(.)','varchar(50)')<>''
)
select STUFF(
(select ' and ' + name + '='''+val+'''' from cte for xml path('')),1,4,'')
但是,如果您正在尝试构建一个sql过滤器字符串,我建议使用带有参数的sp_executesql
而不是构建SQL字符串。
答案 1 :(得分:0)
试试这个;这是工作Fiddle
您的变量:
DECLARE @XX XML = '<Name>abc</Name><ID>3</ID><Address>100/8 NY</Address>'
<强>查询:强>
SELECT 'Name = ''' + x.value('Name[1]','VARCHAR(100)') + ''' and ' +
'ID = ''' + x.value('ID[1]','VARCHAR(100)') + ''' and ' +
'Address = ''' + x.value('Address[1]','VARCHAR(100)') + ''''
FROM @XX.nodes('/') MyXml(x)
<强>输出:强>
Name = 'abc' and ID = '3' and Address = '100/8 NY'