我有一个数据库(无论出于何种原因)都有一个包含管道分隔数据的列。
我想快速解析这些数据,因此我想过通过将管道替换为XML属性并将其放入XML数据类型的列中,从而将该列(nvarchar)转换为XML。
它起作用,除非该列具有需要编码的字符,例如“ <”字符。
我发现我可以使用FOR XML子句对XML进行编码,但是,这似乎在数据周围注入了一些XML标签。
例如:(这会导致错误字符错误)
SELECT CAST('<f>' + replace(value,'|','</f><f>') + '</f>' AS XML)
FROM TABLE
这给出了xml编码的值,但是将其包装在“ <value> </ value>”标签中
SELECT value
FROM table
FOR XML PATH('')
关于如何在不添加此额外标签的情况下如何获取XML编码值的任何想法,这样我就可以在完成后将管道格式转换为XML(最好是一次完成)?
编辑:由于人们在问,这就是5个潜在的数据行可能看起来像什么
foo
foo|bar
foo|bar|1
foo||
baz|
结果是
Col1, Col2, Col3
foo,null,null
foo,bar,null
foo,bar,1
foo,null,null
baz,null,null
我通过在子查询中使用生成的XML类型来实现此目的,例如:(在任何给定的行中最多可以有4列pr 3管道)
SELECT
*,
x.query('f[1]').value('.','nVarChar(2048)') Col1
,x.query('f[2]').value('.','nVarChar(2048)') Col2
,x.query('f[3]').value('.','nvarchar(2048)') Col3
,x.query('f[4]').value('.','nvarchar(2048)') Col4
FROM
(
SELECT *,
CAST('<f>' + REPLACE(Value,'|','</f><f>') + '</f>' AS XML) as x
FROM table
) y
@srutzky很有意思。不,我根本不需要在这里做XML。如果我能找到一种快速而干净的方法来解析基于集合的操作中的管道,那么我将这样做。将查看SQL#文档...
SELECT CAST('<values><f>' +
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(value,'&','&')
,'"','"')
,'<','<')
,'>','>')
,'|','</f><f>') + '</f></values>' AS XML)
FROM TABLE;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句