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