SQL заменяет ASCII на цикл - PullRequest
       10

SQL заменяет ASCII на цикл

0 голосов
/ 14 февраля 2011

В настоящее время я пытаюсь создать хранимую процедуру в SQL.

Но я застрял в somenthing.Я хочу получить данные из нескольких столбцов со значениями nvarchar, но я хочу заменить все расширенные значения ASCII (значения от ASCII 128 и выше)

Я знаю, что это можно сделать с помощью функции Replace, нотакже возможно ли сделать это с помощью цикла или подобного, иначе я должен создать функцию замены для значений ASCII 126 до 255. Я подумал, что может быть более простой способ сделать это, у кого-нибудь есть какие-нибудь идеи?

ИСПОЛЬЗОВАНИЕ: Microsoft SQL Server 2008

Ответы [ 5 ]

3 голосов
/ 14 февраля 2011

Я вижу, что Cade Roux опубликовал некоторые общие указания, пока я работал над реальным кодом.

Создать таблицу сопоставления. Если вам не нужны акцентированные замены символов, вы можете обойтись без такой таблицы. Заполните его по мере необходимости, в качестве примера я нанес 200,228 и 131-134.

select number,
 char(number) original,
 case
 when number < 128 then char(number)
 when number = 200 then 'E'
 when number = 228 or number in (131,132,133,134) then 'a'
 else ' '
 end replacement
into charmap
from master..spt_values
where type='p' and number between 0 and 255

Тестовый стол

create table tvc (id int identity, vc nvarchar(100))
insert tvc select 'abcdef'
insert tvc select 'abätest'
insert tvc select 'abÔÖÕüûýèend'

Запрос на замену

update tvc
SET vc = (select cast
    ((select m.replacement+''
    from master..spt_values v
    inner join charmap m on m.original=substring(tvc.vc,v.number,1) collate French_BIN
    where v.type='P' and v.number between 1 and len(tvc.vc)
    order by v.number
    for xml path(''), type) as varchar(max)))

Примечания:

  • используется spt_values ​​ один раз для столбцов до nvarchar (2047). Вы можете связать их вместе для более длинных столбцов (макс.)
  • сопоставление French_BIN для предотвращения совпадения A с любым из акцентированных A и т. Д.
  • xml type и сложная оболочка для преобразования в тип varchar (max) используется для предотвращения появления пробелов &#x20;


Без использования charmap и без специальной обработки акцентированных символов:
update tvc
set vc = (select cast
    ((select case when ascii(substring(tvc.vc,v.number,1)) < 128
        then substring(tvc.vc,v.number,1)
        else ' ' end
    from master..spt_values v
    where v.type='P' and v.number between 1 and len(tvc.vc)
    order by v.number
    for xml path(''), type) as varchar(max))) r(new)
1 голос
/ 14 февраля 2011
0 голосов
/ 14 февраля 2011

Существует также возможность пропустить строки через непивот, чтобы сгенерировать строки символов, сопоставить с таблицей перевода (теперь для каждой строки) и повторно развернуть, чтобы рекомбинировать строки в столбцы.

ДжеффМодем охватывает использование таблицы подсчета для реализации этой техники:

http://www.sqlservercentral.com/articles/T-SQL/62867/

Cyberkiwi реализовал это почти полностью для вас в своем ответе:

SQL Replace ASCIIС петлей

0 голосов
/ 14 февраля 2011

в противном случае мне нужно создать функцию замены для значений ASCII 126 до 255

Это хуже чем это. Тип nvarchar хранит свои данные в формате UCS-2 (формат Unicode), поэтому вам необходимо заменить тысячи возможных символов:

Лучшим вариантом было бы занести в белый список символы, которые вы хотите, вместо символов в черный список, которые вы не хотите. Вот сценарий SQL, который будет возвращать все символы из строки Unicode, которые входят в стандартный набор ASCII (измененный из примера Microsoft) . Он заменит другие символы одним пробелом. В случае символа «ö» он заменяет символ на «o» (в качестве примера).

 DECLARE @position int, @nstring nvarchar(9), @nch nchar, @output nvarchar(9)
 SET @position = 1
 SET @nstring = N'København'
 SET @output = ''

 WHILE @position <= LEN(@nstring)
 BEGIN
     SELECT @nch = SUBSTRING(@nstring, @position, 1)

     IF UNICODE(@nch) < 128
         SELECT @output = @output + @nch
     ELSE IF @nch = 'ö'
         SELECT @output = @output + 'o'
     ELSE
         SELECT @output = @output + ' '

     SELECT @position = @position + 1
 END

 SELECT @output
 GO

Чтобы иметь дело с вашим последним комментарием (замените акцентированные символы на их безударный вариант ASCII), вам нужно будет добавить много дополнительных условий:

 ELSE IF @nch = 'ö'
     SELECT @output = @output + 'o'

Я не думаю, что MSSQL имеет встроенные функции для этого.

0 голосов
/ 14 февраля 2011

Использовать регулярное выражение:)

Просто перечислите все символы, которые вам действительно нужно извлечь в вашем шаблоне.

Что-то вроде [a-zA-Z0-9]*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...