将mssql中的xml ntext转换为csv(ucomponents migration)

时间:2017-06-07 13:04:18

标签: sql-server xml csv umbraco

我在mssql表中有很多行,它们是xml格式,我想将它们转换为csv。该列是一个ntext,值类似。

<MultiNodePicker type="content">
  <nodeId>5713</nodeId>
  <nodeId>6817</nodeId>
  <nodeId>5424</nodeId>
  <nodeId>1888</nodeId>
  <nodeId>6128</nodeId>
  <nodeId>6339</nodeId>
</MultiNodePicker>

我希望将它们转换为5713,6817,5424,1888,6128,6339 有没有想过如何用sql命令实现这个?

**可能这似乎是https://social.msdn.microsoft.com/Forums/sqlserver/en-US/780e80b2-f898-4451-b19f-332289fb1c8d/sql-xml-get-xml-values-into-csv?forum=sqlxml的方法,将其保存在一个函数中,然后遍历所有行并更新值。目前它在x.y.value失败了。

我还尝试使用替换,但它失败了,因为它是xml并且它没有获得xml节点之间的空间。

我也用过

set dataNvarchar = substring(CAST(dataNtext as nvarchar(500)), patindex('%[0-9]%', CAST(dataNtext as nvarchar(500))), 1+patindex('%[0-9][^0-9]%', CAST(dataNtext as nvarchar(500))+'x')-patindex('%[0-9]%', CAST(dataNtext as nvarchar(500))))

但它只获得第一个数字。

*******其他解决方案********* 这些值来自Umbraco的uComponent插件。我无法找到一种方法将其作为xml读取 - 即使这个解决方案是正确的xml是正确的。 相反,我写了这个功能解决了我的问题

Create Function [dbo].[ParseXml](@text ntext) 
returns nvarchar(500) as 
Begin 
declare @strnvar nvarchar(MAX) -- main string to subtruct
declare @numberstr nvarchar(500) -- extracted number
declare @csvstr nvarchar(500) -- constructed csv string
-- Convert text to nvarchar
set @strnvar = CAST(@text as nvarchar(MAX))
set @csvstr = ''
set @numberstr = substring(@strnvar, patindex('%[0-9]%', @strnvar), 1 + patindex('%[0-9][^0-9]%', @strnvar+'x') - patindex('%[0-9]%', @strnvar))

while(DATALENGTH(@numberstr) > 0)
BEGIN 
set @csvstr = @csvstr + @numberstr + ','
set @strnvar = REPLACE(@strnvar, @numberstr, '')
set @numberstr = substring(@strnvar, patindex('%[0-9]%', @strnvar), 1 + patindex('%[0-9][^0-9]%', @strnvar+'x') - patindex('%[0-9]%', @strnvar))
END

IF RIGHT(@csvstr,1) = ',' 
    set @csvstr =  LEFT(@csvstr, LEN(@csvstr) - 1)
return @csvstr
end 
GO

2 个答案:

答案 0 :(得分:2)

如果将ntext转换为xml,则可以将逗号分隔为

5713,6817,5424,1888,6128,6339

输出如下:

Create Function [dbo].[ParseXml](@text ntext) returns nvarchar(500) as 
Begin declare @x xml = @text 
return 
Stuff(( Select ',' + y.value(N'text()[1]',N'nvarchar(MAX)') FROM @x.nodes(N'MultiNodePicker/nodeId') as x(y) for xml path('')),1,1,'') 
end 


declare @x nvarchar(500) = '<MultiNodePicker type="content">
  <nodeId>5713</nodeId>
  <nodeId>6817</nodeId>
  <nodeId>5424</nodeId>
  <nodeId>1888</nodeId>
  <nodeId>6128</nodeId>
  <nodeId>6339</nodeId>
</MultiNodePicker>'

select  dbo.ParseXml(@x)

我创建了如下功能,它工作正常:

+-----+---------+---------+------------+-------+
| id  |  name   | course  | specialty  |  gpa  |
+-----+---------+---------+------------+-------+

输出:与上述相同

答案 1 :(得分:0)

declare @text varchar(max) = '<MultiNodePicker type="content">
  <nodeId>5713</nodeId>
  <nodeId>6817</nodeId>
  <nodeId>5424</nodeId>
  <nodeId>1888</nodeId>
  <nodeId>6128</nodeId>
  <nodeId>6339</nodeId>
</MultiNodePicker>'


declare @xml xml = @text;


select
t.c.query('.').value('.', 'int') as NodeId
from @xml.nodes('/MultiNodePicker/nodeId') t(c)