Sql server 在TSQL中合并和修改XML
使用SQLServer2005,是否可以同时组合XML和添加属性 不幸的是,由于项目限制,我需要一个SQLServer2005解决方案 考虑以下内容,我需要在新元素中组合来自多行的XMLSql server 在TSQL中合并和修改XML,sql-server,xml,tsql,sql-server-2005,Sql Server,Xml,Tsql,Sql Server 2005,使用SQLServer2005,是否可以同时组合XML和添加属性 不幸的是,由于项目限制,我需要一个SQLServer2005解决方案 考虑以下内容,我需要在新元素中组合来自多行的XML ; WITH [TestTable] AS ( SELECT 7 AS [PkId], CAST('<data><id>11</id><id>12</id></data>' AS XML) AS [Data] UNION A
; WITH [TestTable] AS (
SELECT 7 AS [PkId], CAST('<data><id>11</id><id>12</id></data>' AS XML) AS [Data]
UNION ALL
SELECT 12, CAST('<data><id>22</id></data>' AS XML)
UNION ALL
SELECT 43, CAST('<data><id>33</id></data>' AS XML)
)
SELECT (
SELECT XMLDATA as [*]
FROM (
SELECT [Data] AS [*]
FROM [TestTable]
FOR XML PATH(''), TYPE
) AS DATA(XMLDATA)
FOR XML PATH('root')
)
我的直觉是,如果不使用光标,这将是不可能的,但如果有人知道一种方法,我很乐意听到
应@MattA的要求,以下是表格中一些随机数据的示例
[PkId] [UserId] [SubmittedDate] [Data]
1 1 2015-03-24 12:34:56 '<data><id>1</id><id>2</id></data>'
2 1 2015-03-23 09:15:52 '<data><id>3</id></data>'
3 2 2015-03-22 16:01:23 '<data><id>4</id><id>5</id></data>'
4 1 2015-03-21 13:45:34 '<data><id>6</id></data>'
日期将使用126日期格式进行格式化,该格式可从获得。以下是您的快速答案。XML确实支持modify,但在这样的小数据集上分解也非常有效 代码 还有XML
XML在SQL Server中完全符合CRUD。今天我会在空闲时间做一个例子,除非别人先做。看看这是否对你有帮助:谢谢你的回答,马特。。。pkid是一个简单的例子,但实际上并不是我所需要的。将作为属性添加的实际数据将来自表中的datetime列。。。因此,我不确定这种方法是否适用于我的具体案例。请看一下更新。我将当前的时间戳放在@PKid列的源代码中,以显示datetime。在该步骤中要做的是连接到源数据,并从源表中提取所需的列。我认为当前的_TIMESTAMP与2005兼容,但是GET_DATE也可以。走近Matt-我真的很感谢您的努力,但是属性的值取自表中的一列,该列也包含XML字段。因此,我需要为行中的XML提供一个pkid属性,其中该属性的值是同一行的datetime值。请添加一个希望从中获取datetime列的表示例。还请包括与id字段相关的值。我可以举出一个简单的例子,但我更愿意准确地说出你们的要求。请参阅更新的问题-我希望这能让它更清楚,我为任何混淆道歉。我试图通过说明pkid字段使问题变得更简单,目的是在它工作后更改为submitteddate字段
<root>
<data pkid="7"><id>11</id><id>12</id></data>
<data pkid="12"><id>22</id></data>
<data pkid="43"><id>33</id></data>
</root>
[PkId] [UserId] [SubmittedDate] [Data]
1 1 2015-03-24 12:34:56 '<data><id>1</id><id>2</id></data>'
2 1 2015-03-23 09:15:52 '<data><id>3</id></data>'
3 2 2015-03-22 16:01:23 '<data><id>4</id><id>5</id></data>'
4 1 2015-03-21 13:45:34 '<data><id>6</id></data>'
<root>
<data submitteddate="2015-03-24T12:34:56"><id>1</id><id>2</id></data>
<data submitteddate="2015-03-23T09:15:52"><id>3</id></data>
<data submitteddate="2015-03-21T13:45:34"><id>6</id></data>
</root>
--The existing XML
DECLARE @XML XML = '<root>
<data><id>11</id></data>
<data><id>22</id></data>
<data><id>33</id></data>
</root>'
--XML Shredded Back to a table
;WITH
ShreddedXML AS (
SELECT
ID = FieldAlias.value('(id)[1]','int')
FROM
@XML.nodes('/root/data') AS TableAlias(FieldAlias)
), ArbitraryPKGenerator AS (
SELECT CURRENT_TIMESTAMP AS PKid,
ID
FROM ShreddedXML
)
SELECT A.PKId AS "@PKid",
A.ID AS "id"
FROM ArbitraryPKGenerator AS A
FOR XML PATH('data'), ROOT('root')
<root>
<data PKid="2015-03-24T09:44:55.770">
<id>11</id>
</data>
<data PKid="2015-03-24T09:44:55.770">
<id>22</id>
</data>
<data PKid="2015-03-24T09:44:55.770">
<id>33</id>
</data>
</root>