Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
连接SQL XML字段中的值_Sql_Xml - Fatal编程技术网

连接SQL XML字段中的值

连接SQL XML字段中的值,sql,xml,Sql,Xml,我在SQL Server 2012中有一个表,其中有一个XML字段。该字段包含数组。以下格式的元素数不是常量: <values> <value>A</value> <value>B</value> <value>C</value> <value>D</value> </values> 我试过: SELECT myField.value('.',

我在SQL Server 2012中有一个表,其中有一个XML字段。该字段包含数组。以下格式的元素数不是常量:

<values>
    <value>A</value>
    <value>B</value>
    <value>C</value>
    <value>D</value>
</values>
我试过:

SELECT myField.value('.', 'NVARCHAR(50)')
FROM   myTable

这会创建“ABCD”,但我不知道如何在实际情况下对其进行分隔,因为它们不是单字符值。

我想到了一种方法来实现这一点

SELECT REPLACE(
           REPLACE(
               REPLACE(
                   CAST([myField] As NVARCHAR(MAX)), 
                   '<values><value>', 
                   ''), 
               '</value></values>', 
               ''), 
           '</value><value>', 
           ';'
       ) As [Hacked] 
FROM   [myTable]
…但这让我觉得有点脏。一定有更好的办法。

试试这个

DECLARE @myTable TABLE (id int,myField XML)

INSERT INTO @myTable(id,myField) VALUES(1,'<values>
    <value>A</value>
    <value>B</value>
    <value>C</value>
    <value>D</value>
</values>')


;WITH xmltable
AS
(
    SELECT id, myField.v.value('.', 'varchar(200)') AS myField
    FROM @myTable 
    CROSS APPLY myField.nodes('/values/value') AS myField(v)
)

SELECT STUFF((SELECT ';' + myField 
                  FROM xmltable t2 
                  WHERE t2.id = t1.id  
                  FOR XML PATH('')),1,1,'') AS myField
FROM xmltable t1
GROUP BY id

谢谢,我希望能有更简单的东西,但我开始觉得这是不可能的。
DECLARE @myTable TABLE (id int,myField XML)

INSERT INTO @myTable(id,myField) VALUES(1,'<values>
    <value>A</value>
    <value>B</value>
    <value>C</value>
    <value>D</value>
</values>')


;WITH xmltable
AS
(
    SELECT id, myField.v.value('.', 'varchar(200)') AS myField
    FROM @myTable 
    CROSS APPLY myField.nodes('/values/value') AS myField(v)
)

SELECT STUFF((SELECT ';' + myField 
                  FROM xmltable t2 
                  WHERE t2.id = t1.id  
                  FOR XML PATH('')),1,1,'') AS myField
FROM xmltable t1
GROUP BY id