gpt4 book ai didi

sql - 如何在没有额外 XML 开销的情况下在 T SQL 中对 XML 进行编码

转载 作者:数据小太阳 更新时间:2023-10-29 02:29:12 24 4
gpt4 key购买 nike

我有一个数据库(无论出于何种原因)有一列包含竖线分隔的数据。

我想快速解析此数据,因此我考虑过将此列 (nvarchar) 转换为 XML,方法是用 XML 属性替换管道并将其放入别处的 XML 数据类型列中。

它有效,除非该列具有需要编码的字符,例如“<”字符。

我发现我可以使用 FOR XML 子句对 XML 进行编码,但是,这似乎会在数据周围注入(inject)一些 XML 标记。

例如:(这给出了坏字符的错误)

SELECT CAST('<f>' + replace(value,'|','</f><f>') + '</f>' AS XML)
FROM TABLE

这给出了 xml 编码的值,但是将它包装在“ ”标签中

  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,'&','&amp;')
,'"','&quot;')
,'<','&lt;')
,'>','&gt;')
,'|','</f><f>') + '</f></values>' AS XML)
FROM TABLE;

关于sql - 如何在没有额外 XML 开销的情况下在 T SQL 中对 XML 进行编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36088610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com