将mssql中的xmlntext转csv(ucomponents迁移)
Convert xml ntext in mssql to csv (ucomponents migration)
我在 mssql table 中有很多行采用 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 节点之间获得 space。
我也用过
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
如果你将 ntext 转换为 xml 那么你可以构建逗号分隔如下
declare @x xml = '<MultiNodePicker type="content">
<nodeId>5713</nodeId>
<nodeId>6817</nodeId>
<nodeId>5424</nodeId>
<nodeId>1888</nodeId>
<nodeId>6128</nodeId>
<nodeId>6339</nodeId>
</MultiNodePicker>'
Select Stuff(( Select ','+ y.value(N'text()[1]', N'nvarchar(MAX)')
FROM @x.nodes(N'MultiNodePicker/nodeId') as x(y) for xml path('') ),1,1,'')
输出如下:
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)
输出:同上
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)
我在 mssql table 中有很多行采用 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 节点之间获得 space。
我也用过
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
如果你将 ntext 转换为 xml 那么你可以构建逗号分隔如下
declare @x xml = '<MultiNodePicker type="content">
<nodeId>5713</nodeId>
<nodeId>6817</nodeId>
<nodeId>5424</nodeId>
<nodeId>1888</nodeId>
<nodeId>6128</nodeId>
<nodeId>6339</nodeId>
</MultiNodePicker>'
Select Stuff(( Select ','+ y.value(N'text()[1]', N'nvarchar(MAX)')
FROM @x.nodes(N'MultiNodePicker/nodeId') as x(y) for xml path('') ),1,1,'')
输出如下:
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)
输出:同上
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)