2013-02-15 52 views
3

我想从XML变量中检索传递所需属性名称的XML属性。第一个select语句可以很好地检索正确的属性值。但是,当我尝试在SQL变量中设置所需的属性名称时,显示的所有内容都是字符串/root/attribs/@id而不是实际值。我已经尝试了@path变量的众多排列,都无济于事。T-SQL使用变量从xml检索sql属性

我在这里错过了什么?

DECLARE @XMLString XML = '<root><attribs flags="1" id="test_id" platform="test_platform" /></root>'; 

SELECT 
    flags = x.c.value('(/root/attribs/@flags)[1]', 'nvarchar(50)') , 
    id = x.c.value('(/root/attribs/@id)[1]', 'nvarchar(50)') , 
    [platform] = x.c.value('(/root/attribs/@platform)[1]', 'nvarchar(50)') 
FROM 
    @XMLString.nodes('/*') x (c); 

DECLARE @Path NVARCHAR(50) = '/root/attribs/@id'; 
SELECT 
    result = x.c.value('(sql:variable("@Path"))[1]', 'nvarchar(50)') 
FROM 
    @XMLString.nodes('/*') x (c); 
+0

我不认为你可以使用一个变量来指定你的xquery,只适用于你在其中引用的值。 – muhmud 2013-02-15 21:52:39

回答

4

这将允许您指定属性名称。

DECLARE @XMLString xml = ' 
    <root> 
    <attribs flags="1" id="test_id" platform="test_platform" /> 
    </root>' 

DECLARE @Attribute nvarchar(max) = 'flags' 

SELECT 
    t.x.value('(/root/attribs/@*[local-name() = sql:variable("@Attribute")])[1]', 'nvarchar(max)') 
FROM @XMLString.nodes('/*') t(x)