包含XML的SQL Server列需要合并

包含XML的SQL Server列需要合并,sql,sql-server,xml,xslt,Sql,Sql Server,Xml,Xslt,我有一个sql server 2008 r2数据库,其中一列中包含一个包含原始XML的表。我编写了一个查询,使用GROUPBY和stuff从这个表中提取数据,以连接满足2列GROUPBY子句的所有列。问题是,当我填充列时,会得到重复的XML声明,而XML是无效的 <?xml version="1.0" encoding="UTF-8"?> <Fruits> <Fruit Type="Lemons" Price="0.50" /> <Fru

我有一个sql server 2008 r2数据库,其中一列中包含一个包含原始XML的表。我编写了一个查询,使用GROUPBY和stuff从这个表中提取数据,以连接满足2列GROUPBY子句的所有列。问题是,当我填充列时,会得到重复的XML声明,而XML是无效的

<?xml version="1.0" encoding="UTF-8"?>
<Fruits>
    <Fruit Type="Lemons" Price="0.50" />
    <Fruit Type="Apples" Price="0.75" />
</Fruits>
<?xml version="1.0" encoding="UTF-8"?>
<Fruits>
    <Fruit Type="Cherries" Price="0.10" />
    <Fruit Type="Dates" Price="0.25" />
</Fruits>

谢谢

这很难看,但是如果你总是知道对象将是什么,你可以去掉你不想要的xml

SELECT ..., '<?xml version="1.0" encoding="UTF-8"?><Fruits>' + 
            REPLACE( REPLACE(xml_column, 
                             '<?xml version="1.0" encoding="UTF-8"?><Fruits>', 
                             ''), 
                     '</Fruits', 
                     '') + 
            '</Fruits>

或者,使用类似的步骤预处理数据,并使用replace函数添加缺少xml标题的列。

这是我现在可以想到的快速解决方案

CREATE TABLE Test2(ID INT,Col1 XML, Col2 XML)
INSERT INTO Test2 VALUES(1,'<?xml version="1.0" encoding="UTF-8"?><Fruits><Fruit Type="Lemons" Price="0.10" /><Fruit Type="Apples" Price="0.25" /></Fruits>','<?xml version="1.0" encoding="UTF-8"?><Fruits><Fruit Type="Cherries" Price="0.10" /><Fruit Type="Dates" Price="0.25" /></Fruits>')
INSERT INTO Test2 VALUES(2,'<?xml version="1.0" encoding="UTF-8"?><Fruits><Fruit Type="Lemons2" Price="0.10" /><Fruit Type="Apples2" Price="0.25" /></Fruits>','<?xml version="1.0" encoding="UTF-8"?><Fruits><Fruit Type="Cherries2" Price="0.10" /><Fruit Type="Dates3" Price="0.25" /></Fruits>')

SELECT ID, (
SELECT Fruit,Price FROM(
SELECT  
       Tbl.Col.value('@Type', 'varchar(100)') AS Fruit,  
       Tbl.Col.value('@Price', 'varchar(10)') AS Price
FROM   Col1.nodes('//Fruit') Tbl(Col)  
UNION 
SELECT  
       Tbl.Col.value('@Type', 'varchar(100)'),  
       Tbl.Col.value('@Price', 'varchar(10)')
FROM   Col2.nodes('//Fruit') Tbl(Col)) Fruits FOR XML AUTO
) FROM Test2

我沿着这条路径开始,但担心模式中的更改需要重新编码。谢谢你的主意!最后,我认为这是最好的解决办法。我真的很惊讶SQLServer2008R2没有能力将XPath表达式应用于列。再次感谢你的建议。祝你好运!如果“接受”有用,我将不胜感激。另一方面,可能更好的答案是在XML进入表之前将其解析到结构化表中,但这似乎超出了您的问题范围。这会起作用。我唯一要注意的是XML模式非常深入。如果更改,则需要更改此代码。这是一个有效的解决方案,感谢您的提议。SQl Server无法在XML类型的列中存储UTF-8 XML数据。
SELECT ..., '<?xml version="1.0" encoding="UTF-8"?><Fruits>' + 
            REPLACE( REPLACE(xml_column, 
                             '<?xml version="1.0" encoding="UTF-8"?><Fruits>', 
                             ''), 
                     '</Fruits', 
                     '') + 
            '</Fruits>
CREATE TABLE Test2(ID INT,Col1 XML, Col2 XML)
INSERT INTO Test2 VALUES(1,'<?xml version="1.0" encoding="UTF-8"?><Fruits><Fruit Type="Lemons" Price="0.10" /><Fruit Type="Apples" Price="0.25" /></Fruits>','<?xml version="1.0" encoding="UTF-8"?><Fruits><Fruit Type="Cherries" Price="0.10" /><Fruit Type="Dates" Price="0.25" /></Fruits>')
INSERT INTO Test2 VALUES(2,'<?xml version="1.0" encoding="UTF-8"?><Fruits><Fruit Type="Lemons2" Price="0.10" /><Fruit Type="Apples2" Price="0.25" /></Fruits>','<?xml version="1.0" encoding="UTF-8"?><Fruits><Fruit Type="Cherries2" Price="0.10" /><Fruit Type="Dates3" Price="0.25" /></Fruits>')

SELECT ID, (
SELECT Fruit,Price FROM(
SELECT  
       Tbl.Col.value('@Type', 'varchar(100)') AS Fruit,  
       Tbl.Col.value('@Price', 'varchar(10)') AS Price
FROM   Col1.nodes('//Fruit') Tbl(Col)  
UNION 
SELECT  
       Tbl.Col.value('@Type', 'varchar(100)'),  
       Tbl.Col.value('@Price', 'varchar(10)')
FROM   Col2.nodes('//Fruit') Tbl(Col)) Fruits FOR XML AUTO
) FROM Test2