如何获取SQL Server XML列的xml安全版本

pdi*_*ddy 9 xml t-sql sql-server sql-server-2005

有没有办法在sql server中获取xml列的xml安全版本?

通过xml-Safe我的意思是转义特殊字符,如<,>,',&等.

我想避免自己做替换.在sql server中是否有内置函数.

我想要实现的是将xml内容存储到另一个xml属性中.

jaz*_*ato 15

它不是这个问题的直接答案,但对于那些试图在TSQL中使用xml-escape字符串的人来说,这里写的是一个小函数:

CREATE FUNCTION escapeXml 
(@xml nvarchar(4000))
RETURNS nvarchar(4000)
AS
BEGIN
    declare @return nvarchar(4000)
    select @return = 
    REPLACE(
        REPLACE(
            REPLACE(
                REPLACE(
                    REPLACE(@xml,'&', '&amp;')
                ,'<', '&lt;')
            ,'>', '&gt;')
        ,'"', '&quot;')
    ,'''', '&#39;')

return @return
end
GO
Run Code Online (Sandbox Code Playgroud)


Rem*_*anu 8

我假设xml-safe意味着转义XML特殊标记.如果您希望将XML列包含在另一个XML文档中,那么您有两个选择:

  • 将列投影为[*]:select ..., xmlcolumn as [*], ... from ... for xml path...这将在结果XMl中嵌入列的XML内容.例如.如果列具有值,<element>value</element>那么结果将是<root><row><element>value</element></row></root>.
  • 将列作为列名称进行投影:select ..., xmlcolumn, ... from ... for xml path...这会将列的内容作为值插入(即,它将对其进行转义).例如.将产生与上述相同的值<root><row><xmlcolumn>&lt;element&gt;&lt;value&lt;/element&gt;.

如果您的问题是关于其他问题,那么您将不得不以适当的方式对其进行重新措辞并正确使用术语.除了你之外,不要发明任何人都不懂的新术语.

更新:

如果要将XML值插入列中,则根本不需要执行任何操作.客户端库知道如何处理正确的转义.只要你正确编写代码.记住,XML 不是一个字符串,永远应该被视为一个字符串.如果在客户端编写XML,请使用适当的XML库(XmlWriter,XML DOM, Linq to XML等).将XML传入SQL Server时,请使用适当的类型:SqlXml.存储过程应使用适当的参数类型:XML.阅读时,使用适当的方法读取XML:GetSqlXml().同样可以在一个miriad设计器(LINQ to SQL,EF等)中声明类型.最终,永远不需要手动转义XML字符.如果您发现自己这样做,那么您使用的是错误的API,您必须返回绘图板.

一个好的开始阅读是Microsoft SQL Server 2005中的XML支持.

最后,在你描述的时候操作XML(用表B的XML列更新表A的XML列),你使用XML方法,特别是修改(... insert ...),然后绑定表B列里面的XQuery使用sql:column:

update A
set somecolumn.modify('insert {sql:column("B.othercolumn")} before somenode')
from A join B on ...;
Run Code Online (Sandbox Code Playgroud)

在你评论你威胁XML作为一个字符串,正如我已经说过,你永远不应该这样做:字符串和XML是水和石油.


Man*_*ari 5

另一种更简单的xml转义字符串的方法是使用以下方法:

SELECT @String FOR XML PATH('')
Run Code Online (Sandbox Code Playgroud)

例如

DECLARE @Input NVARCHAR(4000) = 'bacon & eggs'
DECLARE @String = (SELECT @Input FOR XML PATH(''))
Run Code Online (Sandbox Code Playgroud)

然后从那里使用@string