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,'&', '&')
,'<', '<')
,'>', '>')
,'"', '"')
,'''', ''')
return @return
end
GO
Run Code Online (Sandbox Code Playgroud)
我假设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><element><value</element>.如果您的问题是关于其他问题,那么您将不得不以适当的方式对其进行重新措辞并正确使用术语.除了你之外,不要发明任何人都不懂的新术语.
更新:
如果要将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是水和石油.
另一种更简单的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