Удалить спецсимвол из поля SQL - PullRequest
0 голосов
/ 25 января 2019

Один из столбцов в моем операторе выбора имеет символ табуляции строки, т.е. & # xb. Я использую это поле в XML-файле, и когда я получаю ошибку недопустимый символ в XML-файле. Есть ли способ в SQL избежать / заменить специальные символы.

Я смотрел по этой ссылке

https://www.sqlshack.com/replace-ascii-special-characters-sql-server/

но просто интересно, есть ли более простой способ сделать это.

Я попробовал это без удачи

declare @test nvarchar(50) = 'abe&#xbprakash'
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]

Результат: Result

Текст со специальным символом выглядит следующим образом «Миротворный детский центр, меридианский путь»

1 Ответ

0 голосов
/ 25 января 2019

Читая ваш вопрос и все комментарии, я чувствую, что у вас неправильное представление о специальных символах .

Прежде всего вы должны знать, что 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) = 'abe&#xbprakash'
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 &lt;forbidden&gt; text</ReplacedEntities>
</Test>

Двигатель должен был заменить скобки на соответствующие объекты.

Важно 1 : Никогда не пытайтесьсделайте это сами. Это делается XML-движком неявно.

Важно 2 : чтение XML автоматически заменит сущности. Никогда не пытайтесь делать это самостоятельно ...

Попробуйте это

DECLARE @xml XML=
N'<Test>
  <ReplacedEntities>Some &lt;forbidden&gt; text</ReplacedEntities>
</Test>';

SELECT @xml.value('(/Test/ReplacedEntities/text())[1]','nvarchar(100)') 

returns "Some <forbidden> text"

Вы видите, что двигатель сделает всю тяжелую работу за вас ...

О вашей реальной проблеме: вы не предоставилиПроблемы с созданием строк (пожалуйста, избегайте изображений!). Но вы можете заменить символ NVARCHAR, используя N-литерал или функцию NCHAR(), чтобы получить правильное значение. В противном случае вы имеете дело только с вопросительными знаками (см. пример в начале).

Надеюсь, это поможет ...

...