2017-03-31 80 views
2

在SQL Server 2012中(SP1),什么是采取看起来像这样的数据的最佳方式:最好的办法

declare @t table (
    id int, 
    data xml 
) 

insert into @t values (1, '<node/>'), (2, '<node/>') 

id data 
1 <node /> 
2 <node /> 

,并把它变成

id data 
1 <root><node /></root> 
2 <root><node /></root> 

有没有比将其转换为字符数据更有效的方法,添加节点开始和结束标记,然后将其转换回xml?我在更大的数据集上处理这个问题,所以这只是一个简单的例子。

回答

3

您可以使用简单的XQuery在查询结果中添加<root>父项。涉及XML和VARCHAR数据类型之间没有回往复转换:

SELECT id, data.query('<root>{.}</root>') AS data 
FROM @t 

快速测试:http://rextester.com/RLZ30365

简要说明:

  • {}:表明两者之间的文本应视为XQuery表达式而不是文字
  • .:参考当前上下文节点,在这种情况下是<node />
4

还有一个方法(但我最喜欢的是har07的答案)

declare @t table (
    id int, 
    data xml 
) 

insert into @t values (1, '<node/>'), (2, '<node/>'); 

SELECT id 
     ,(SELECT data AS [*] FOR XML PATH('root'),TYPE) 
FROM @t; 
+0

总是好的选择。但既然你更喜欢har07的答案,而且它非常适合,我会随之而去。 – jep

+0

@jep耶!选项非常棒! (我必须查找* cromulent *,thx为新单词:-D)。这仅仅是为了辛普森一家的极客们还是可以在每天的谈话中使用的东西?) – Shnugo

+0

_Cromulent_是一个可以模仿任何人的词汇的词,辛普森一家的粉丝。 – jep