select语句中的一列具有行制表符,即&#xb。我在xml文件中使用此字段,当我在XML文件中收到错误非法字符时。在sql中有没有一种方法可以避免/替换特殊字符。
我一直在看这个链接
https://www.sqlshack.com/replace-ascii-special-characters-sql-server/
,但是想知道是否有更简单的方法可以做到这一点。
我没有运气尝试过
declare @test nvarchar(50) = 'abeprakash'
select ISNULL(REPLACE(REPLACE(REPLACE(REPLACE(@test, '!', ''), '#', ''), '$', ''), '&', ''), '') AS [Address1]
set @test = 'Peacehaven ChildrenÍs CentreMeridian Way
'
select ISNULL(REPLACE(REPLACE(REPLACE(REPLACE(@test, '!', ''), '#', ''), '$', ''), '&', ''), '') AS [Address2]
具有特殊字符的文本如下 “和平之路儿童中心的子午线”
答案 0 :(得分:1)
阅读您的问题和所有评论都会给我一种感觉,即您对特殊字符有误解。
首先,您必须知道,SQL-Server知道两种字符串:
UTF-16
几乎相同。您可以说这是 unicode ,支持几乎所有现有角色。非常重要:文字是-默认情况下为VARCHAR
类型。将这样的文字设置为声明为NVARCHAR
的变量仍将处理文字为VARCHAR
。要使用NVARCHAR
处理文字,需要使用前导N
。
尝试一下
SELECT 'Кто там?' AS RussianWithoutTheN --??? ????
,N'Кто там?' AS TheSameWithTheN --Кто там?
所以您的代码
declare @test nvarchar(50) = 'abeprakash'
set @test = 'Peacehaven ChildrenÍs CentreMeridian Way
'
...将需要N
保留所有隐藏的字符...
现在有关XML:
XML是NVARCHAR
的内幕,无需担心此类字符:
尝试一下:
SELECT 'Кто там?' AS RussianWithoutTheN
,N'Кто там?' AS TheSameWithTheN
FOR XML PATH('Test')
结果
<Test>
<RussianWithoutTheN>??? ????</RussianWithoutTheN>
<TheSameWithTheN>Кто там?</TheSameWithTheN>
</Test>
但是有一些禁止字符。 XML是基于文本的容器。这意味着:
<, > and &
尝试一下:
SELECT 'Some <forbidden> text' AS ReplacedEntities
FOR XML PATH('Test')
结果:
<Test>
<ReplacedEntities>Some <forbidden> text</ReplacedEntities>
</Test>
引擎必须用相应的实体替换括号。
重要事项1 :您永远不要尝试自己这样做。这是由XML引擎隐式完成的。
重要2 :读取XML会自动替换实体。永远不要自己做...
尝试一下
DECLARE @xml XML=
N'<Test>
<ReplacedEntities>Some <forbidden> text</ReplacedEntities>
</Test>';
SELECT @xml.value('(/Test/ReplacedEntities/text())[1]','nvarchar(100)')
returns "Some <forbidden> text"
您看到,引擎将为您完成所有艰苦的工作...
关于您的实际问题:您没有提供使字符串出现问题的麻烦(请避免使用图片!)。但是您可以使用N字面量或函数NCHAR()
替换NVARCHAR字符以获取正确的值。否则,您只处理问号(请参见开头的示例)。
希望这对您有帮助...