Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как выяснить имеется ли в переменной NVARCHAR хотя бы одна русская буква?  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 671
Добрый день.

Написал вот такой алгоритм:

CREATE PROCEDURE [SMS_CountSMSInMessage]
  @Message	NVARCHAR(512),
  @Result	INT = 0 OUTPUT
AS
SET NOCOUNT ON;

SET @Result = 0

DECLARE @Position INT;
DECLARE @Format INT

SET @position = 1
SET @Format = 1

WHILE @position <= LEN(@Message)
BEGIN
  -- Если код символа > 127 то русские символы.
  IF ASCII(SUBSTRING(@Message, @position, 1)) > 127
    SET @Format = 2
  -- Если формат определён заранее выходим из цикла.
  IF @Format = 2
    BREAK
  SET @position = @position + 1
END;


Всё работает, проблем нет. Но всё это делалось для одной переменной. Теперь необходимо обернуть в функцию и использовать в запросах, где будет присутствовать в среднем 10т. записей. Я подумал, что может работать медленно т.к. каждую запись придётся сканировать в цикле.

Вопрос: есть ли другой более быстрый способ через T-SQL?
30 авг 16, 10:19    [19606030]     Ответить | Цитировать Сообщить модератору
 Re: Как выяснить имеется ли в переменной NVARCHAR хотя бы одна русская буква?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
Игорь_UUS
Вопрос: есть ли другой более быстрый способ через T-SQL?
Да простым лайком.
like '%[абвгднуитакдалее]%'

И охота вам было цикл писать :-)

Ну и алгоритм "Если код символа > 127 то русские символы." неправильный, это могут быть и спецсимволы, и разные нерусские буквы, тем более если речь о NVARCHAR
30 авг 16, 10:27    [19606081]     Ответить | Цитировать Сообщить модератору
 Re: Как выяснить имеется ли в переменной NVARCHAR хотя бы одна русская буква?  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 671
alexeyvg,

Спасибо за ответ. Хотел как проще, но... дело в том что мне необходимо определить, если ли хотя бы один символ по коду ASCII больший 127-го
30 авг 16, 10:31    [19606107]     Ответить | Цитировать Сообщить модератору
 Re: Как выяснить имеется ли в переменной NVARCHAR хотя бы одна русская буква?  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
SELECT *, CASE WHEN PATINDEX('%[^a-z0-9]%', txt) = 0 THEN 1 ELSE 0 END
FROM (
    VALUES (N'вапText123'), (N'Text123')
) t(txt)
30 авг 16, 10:31    [19606108]     Ответить | Цитировать Сообщить модератору
 Re: Как выяснить имеется ли в переменной NVARCHAR хотя бы одна русская буква?  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
SELECT
 ISNULL
 (
  (SELECT 'Имеется русская буква' WHERE @Message LIKE N'%[абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ]%')
 ,'Нет русских букв'
 );
30 авг 16, 10:34    [19606121]     Ответить | Цитировать Сообщить модератору
 Re: Как выяснить имеется ли в переменной NVARCHAR хотя бы одна русская буква?  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
AlanDenton
SELECT *, CASE WHEN PATINDEX('%[^a-z0-9]%', txt) = 0 THEN 1 ELSE 0 END
FROM (
    VALUES (N'вапText123'), (N'Text123')
) t(txt)
Зависит от COLLATE
30 авг 16, 10:35    [19606128]     Ответить | Цитировать Сообщить модератору
 Re: Как выяснить имеется ли в переменной NVARCHAR хотя бы одна русская буква?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
Игорь_UUS
Спасибо за ответ. Хотел как проще, но... дело в том что мне необходимо определить, если ли хотя бы один символ по коду ASCII больший 127-го

Ну, тогда циклом :-)

А вообще какое то странное задание.

Я представляю, как главный бухгалтер говорит вам: "согласно разъяснению минфина от дд/дд/дд, в наименовании контрагента не должно быть символов по коду ASCII больший 127-го" :-)

Либо вы не так поняли бизнес-задачу, либо тот, кто давал вам задание, не так её понял.

Чаще всего подобные бизнес-задачи формулируются как "символы должны быть из допустимого набора", и реализуется в T-SQL операцией:
not like '%^[тут перечисляем допустимые символы]%'
Это будет точно, просто, быстро, без багов, без переписываний десяток раз за год.
А у вас какой то курьёз, а не постановка задачи.
30 авг 16, 10:42    [19606161]     Ответить | Цитировать Сообщить модератору
 Re: Как выяснить имеется ли в переменной NVARCHAR хотя бы одна русская буква?  [new]
Kapadastra
Member

Откуда:
Сообщений: 29
Игорь_UUS,

select поле from таблица lot
where (UPPER(поле) like N'%[А-Я]%')
30 авг 16, 10:46    [19606196]     Ответить | Цитировать Сообщить модератору
 Re: Как выяснить имеется ли в переменной NVARCHAR хотя бы одна русская буква?  [new]
Kapadastra
Member

Откуда:
Сообщений: 29
Kapadastra, lot тут лишний))))
30 авг 16, 10:47    [19606201]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить