Читая ваш вопрос и все комментарии, я чувствую, что у вас неправильное представление о специальных символах .
Прежде всего вы должны знать, что SQL-серверзнает два вида строк:
- VARCHAR (который является 1-байтовым кодированием расширенный ASCII с поддержкой очень маленьких символов
- NVARCHAR (который является 2- UCS-2 с байтовым кодированием, что почти совпадает с
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
под капотом, не нужно беспокоитьсяng о таких символах:
Попробуйте:
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"
Вы видите, что двигатель сделает всю тяжелую работу за вас ...
О вашей реальной проблеме: вы не предоставилиПроблемы с созданием строк (пожалуйста, избегайте изображений!). Но вы можете заменить символ NVARCHAR, используя N-литерал или функцию NCHAR()
, чтобы получить правильное значение. В противном случае вы имеете дело только с вопросительными знаками (см. пример в начале).
Надеюсь, это поможет ...