在sql server中将xml列值编码为xml
Posted
技术标签:
【中文标题】在sql server中将xml列值编码为xml【英文标题】:Encode xml column values as xml in sql server 【发布时间】:2009-06-02 12:12:34 【问题描述】:我有一个方法是直接从数据库中获取 vales,构建一个 xml 字符串,然后将 xml 写入一个文件。
这很好,直到我得到特殊字符,例如“'”、“
有没有人知道 Sql Server 中有什么东西可以让我在选择值时对它们进行编码?例如;
select encode(service_status) from myTable
谢谢。
【问题讨论】:
你能添加你的sql server版本吗... 哇!真的很伤心!但是你不能在 C# 中写一个小函数来做同样的事情并将它添加到 SQL Server 上吗? 我已经添加了对一篇优秀文章的引用。 请编辑问题以说明在 SQL Server 中完成了哪些部分以及在调用应用程序中完成了哪些部分。不清楚。 【参考方案1】:使用FOR XML
子句。
它可以自动从多个值构建XML
:
WITH q AS (
SELECT 'Barnes & Noble' AS shop
UNION ALL
SELECT 'Marks & Spencer'
)
SELECT *
FROM q
FOR XML AUTO, TYPE
---
<q shop="Barnes & Noble" /><q shop="Marx & Spencer" />
如果您只想对现有值进行编码,请使用:
SELECT 'Barnes & Noble'
FOR XML PATH('')
---
Barnes & Noble
【讨论】:
"FOR XML" 也存在于 SQL 2000 中。 msdn.microsoft.com/en-us/magazine/cc163782.aspx @Mitch:我以为只是 2005 年以后,但@gbn 的链接改变了我的想法。 SQL 2005 添加了 XPath/Xquery + xml 数据类型 + 通常使事情变得更好。没有更多的“sp_xmlpreparedocument”! 如果我想直接在 sql server 中构建 xml,但我只想对数据进行编码 - xml 已经在查询返回的应用程序中构建。【参考方案2】:你不需要 CLR 也可以在 sql 中执行...
create function [dbo].[fn_XMLEscape]( @s varchar(max)) returns varchar(max)
as
begin
declare @rs varchar(max)
set @rs = @s
set @rs = replace(@rs, '&', '&')
set @rs = replace(@rs, '''', ''')
set @rs = replace(@rs, '"', '"')
set @rs = replace(@rs, '>', '>')
set @rs = replace(@rs, '<', '<')
Return( @rs)
end
【讨论】:
【参考方案3】:如果您有 >= sql 2005,我认为将您的值填充到 xml 元素中然后将其拉回可能是最简单的。这将实体化任何需要编码的东西。
declare @x xml, @str varchar(8000), @encStr varchar(8000)
set @x = '<a/>'
set @str = '><&'
set @x.modify(
'insert textsql:variable("@str")
as first into (/a)[1]')
set @encStr = CAST(@x.query('/a/text()') as varchar(8000))
select @encStr
--returns: ><&
【讨论】:
【参考方案4】:如果调用应用程序正在构建您返回到 XML 中的内容,则由调用应用程序对数据进行编码。如果您想从 SQL Server 返回 XML,那么这取决于您,Quassnoi 的“FOR XML”答案是正确的。
【讨论】:
【参考方案5】:如果您使用的是 SQL Server 版本 2005/2008,那么您很幸运,因为您可以使用 CLR Functions 创建自己的 ENCODE
函数。
A really good article can be found here.
【讨论】:
我没有使用 .net :( 我使用的是基于 JAVA 的 BPM 套件 :( :( 否则就完美了【参考方案6】:我的变种:
创建函数 dbo.fn_XmlEncode (@STR varchar(200)) 返回 varchar(200) 作为 开始 如果 CHARINDEX('&', @STR) > 0 开始 声明 @POS1 整数,@POS2 整数 SET @POS1 = CHARINDEX('&', @STR) 当@POS1 > 0 开始时 IF SUBSTRING(@STR, @POS1, 5) '&' SET @STR = LEFT(@STR, @POS1 - 1) + '&' + 当@POS1 0 设置@STR = 替换(@STR,'', @STR) > 0 SET @STR = REPLACE(@STR, '>', '>') 返回@STR 结尾 去 -- 测试 SELECT dbo.fn_XmlEncode('&&'), dbo.fn_XmlEncode('&"&&')
【讨论】:
以上是关于在sql server中将xml列值编码为xml的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Server Management Studio 中将列值设置为 NULL?
在 Sql Server 中将 xml 文档作为存储过程的参数传递是不是安全?
尝试将 XML 内容存储到 SQL Server 2005 中失败(编码问题)
将 XML 插入 SQL Server 时如何解决“无法切换编码”错误
在 SQL 中将 XML 文档转换为表格数据集的有效方法,因为随着 xml 的增长,交叉应用 xml 查询的性能呈指数级下降