2015-11-04 112 views
1

我想在SQL Server 2008 R2中编写一个标量值函数,它将采用一块XML和一个XQuery路径,并将结果作为字符串返回。查看仅用于执行XML XQuery的T-SQL,以下示例显示了两条语句(1 & 2)。第一个应该显然工作,但没有。第二个是同样的事情,但没有使用sql:variable()SQL XML查询()使用sql:变量不起作用

declare @xml xml 

set @xml = '<?xml version="1.0" encoding="UTF-8"?> 
<Response version="1.0"> 
    <Transaction> 
     <Processing> 
      <Return>Some text that I need to extract.</Return> 
     </Processing> 
    </Transaction> 
</Response>' 

declare @xquery varchar(100) 
set @xquery = '/Response/Transaction/Processing/Return' 

-- Statement 1 : This should work, but it doesn't 
select 
    CAST(@xml.query('data(*[local-name(.) = sql:variable("@xquery")])') as varchar(max)) 

-- Statement 2 : This does work 
select 
    CAST(@xml.query('data(/Response/Transaction/Processing/Return)') as varchar(max)) 

有谁能告诉我为什么这不起作用吗?我做错了什么,如果确实是可能的话?

我已经看过这个在这个网站上的许多假设的工作示例,这是我如何到达上述代码,但我无法弄清楚为什么我的实现不工作。

+0

本地名不包含路径('选择CAST(@ xml.query(“数据(// * [ local-name(。)=“Return”])')as varchar(max))'在你的例子中工作...) –

+0

对不起马特,但我不明白你的答复,可能是因为我以前没有在SQL中做过很多XML的东西。你能否扩展你的答案? –

回答

0

这是不可能的...... SQL:变量是为了实现一定的价值,而不是一个完整的路径...

我知道的唯一的机会是动态SQL:

(顺便说一句:要恢复值不应使用.query(),并投它,更好地利用.value()

declare @xml xml 
set @xml = '<?xml version="1.0" encoding="UTF-8"?> 
<Response version="1.0"> 
    <Transaction> 
     <Processing> 
      <Return>Some text that I need to extract.</Return> 
     </Processing> 
    </Transaction> 
</Response>'; 

-- Statement "direct value" 
select @xml.value('(/Response/Transaction/Processing/Return)[1]','varchar(max)'); 

--dynamic SQL 
declare @xquery varchar(100)='(/Response/Transaction/Processing/Return)[1]' 
declare @dynamicSQL NVARCHAR(100)='select @xml.value(''' + @xquery + ''',''varchar(max)'')'; 
exec sp_executesql @dynamicSQL, N'@xml XML',@xml; 
+0

谢谢Shnugo,解释事情。 –

+0

@PhilStreet,很高兴帮助你... – Shnugo