在T-SQL中通过XQuery选择时连接xml值

时间:2013-09-03 07:41:03

标签: sql-server xml sql-server-2008 xquery sqlxml

这是我的示例XML:

<root>
    <element>
        <subelement>
            <value code="code1">value1</value>
            <value code="code2">value2</value>
        </subelement>
    </element>
</root>

这是我的测试查询:

DECLARE @tempTable TABLE (
    ValueCode nvarchar(MAX),
    Value nvarchar(MAX)
)

DECLARE @xml XML
select @xml = cast(c1 as xml) from OPENROWSET (BULK 'C:\test.xml', SINGLE_BLOB) as T1(c1)

INSERT INTO @tempTable
SELECT 
    Tbl.Col.value('subelement[1]/@code', 'NVARCHAR(MAX)'),
    Tbl.Col.value('subelement[1]', 'NVARCHAR(MAX)')
FROM @xml.nodes('//element') Tbl(Col)

SELECT * FROM @tempTable

执行时,查询会给出一行,其中ValueCode列包含NULL,Value列包含“value1value2”。我想得到的是与分隔符连接的属性和值。例如,我需要ValueCode来包含'code1; code2'和值包含'value 1;值2' 。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:6)

如果你想要串联字符串,你可以使用xuery:

SELECT 
    Tbl.Col.query('for $i in value return concat($i/text()[1], ";")').value('.', 'nvarchar(max)'),
    Tbl.Col.query('for $i in value return concat($i/@code, ";")').value('.', 'nvarchar(max)')
FROM @xml.nodes('root/element/subelement') Tbl(Col);

如果您希望将值放入行中:

SELECT 
    Tbl.Col.value('.', 'nvarchar(max)'),
    Tbl.Col.value('@code', 'nvarchar(max)')
FROM @xml.nodes('root/element/subelement/value') Tbl(Col);

sql fiddle demo