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

Откуда:
Сообщений: 65
Есть процедура:
ALTER Procedure [dbo].[WZ_Create]

@GuildName varchar(8),
@MasterName varchar(10)
AS
BEGIN
DECLARE @ErrorCode int

SET @ErrorCode = 0
SET XACT_ABORT ON

SET NOCOUNT ON
BEGIN TRANSACTION

Как проверить на символы переменную @GuildName
Разрешено использование только a-zA-Z0-9
6 май 12, 17:11    [12517599]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на символы в MS SQL  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4539
if @GuildName like '%[^a-Z0-9]%' print 'err'

ну а вообще это хреновая идея...
6 май 12, 21:06    [12518034]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на символы в MS SQL  [new]
step_ks
Member

Откуда:
Сообщений: 936
buser, немного ошиблись.
А вообще, лучше перечислить все символы, дабы избежать сюрпризов.
6 май 12, 21:46    [12518129]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на символы в MS SQL  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
vanek2000
Разрешено использование только a-zA-Z0-9


С учетом отквоченного:
DECLARE @GuildName1	varchar(8)
DECLARE @GuildName2	varchar(8)
DECLARE @GuildName3	varchar(8)
DECLARE @GuildName4	varchar(8)
SET @GuildName1='jkYu8hd'
SET @GuildName2='jkOO-t'
SET @GuildName3='578ЩЖ'
SET @GuildName4='Hj%io'
IF @GuildName1 LIKE '%[^a-zA-Z0-9]%' PRINT 'Err' ELSE PRINT 'OK'
IF @GuildName2 LIKE '%[^a-zA-Z0-9]%' PRINT 'Err' ELSE PRINT 'OK'
IF @GuildName3 LIKE '%[^a-zA-Z0-9]%' PRINT 'Err' ELSE PRINT 'OK'
IF @GuildName4 LIKE '%[^a-zA-Z0-9]%' PRINT 'Err' ELSE PRINT 'OK'


step_ks
дабы избежать сюрпризов


Опять же, с учетом того же самого - каких, к примеру? Ну что бы мне самому тоже знать...
7 май 12, 10:41    [12519276]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на символы в MS SQL  [new]
step_ks
Member

Откуда:
Сообщений: 936
SamMan

step_ks
дабы избежать сюрпризов


Опять же, с учетом того же самого - каких, к примеру? Ну что бы мне самому тоже знать...

DECLARE @GuildName1	varchar(8)
SET @GuildName1='№'
IF @GuildName1 collate Cyrillic_General_CI_AS LIKE '%[^a-zA-Z0-9]%' PRINT 'Err' ELSE PRINT 'OK'
OK
7 май 12, 13:09    [12519783]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на символы в MS SQL  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
step_ks,

Да, забавный "глючок", согласен, спасибо! Как обычно, сервер пытается "сделать хорошо" и засчитать NUMERO SIGN (№) за латинскую N. В результате - все как обычно:
[n-o] - "зачет"
[n] - не зачет
[nN] - не зачет
и т.д.

В общем проблемный символ расположен строго МЕЖДУ N и O латинскими, но не по краям этого "диапазона". :) Ну и плюс разное поведение в разных коллейшенах, да.
10 май 12, 12:27    [12529207]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на символы в MS SQL  [new]
почему так?
Guest
step_ks
SamMan
пропущено...


Опять же, с учетом того же самого - каких, к примеру? Ну что бы мне самому тоже знать...

DECLARE @GuildName1	varchar(8)
SET @GuildName1='№'
IF @GuildName1 collate Cyrillic_General_CI_AS LIKE '%[^a-zA-Z0-9]%' PRINT 'Err' ELSE PRINT 'OK'
OK


граждане, а можно популярно объяснить, в чем прикол?
у меня не воспроизводится, выдает Err.
хотя наверное тут при чем-то, что у меня и сервера, и базы некириллический collation:
SQL_Latin1_General_CP1_CI_AS
10 май 12, 12:58    [12529414]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на символы в MS SQL  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> хотя наверное тут при чем-то, что у меня и сервера, и базы некириллический collation:
> SQL_Latin1_General_CP1_CI_AS

ага.
DECLARE @GuildName1	Nvarchar(8)
SET @GuildName1=N'№'


Posted via ActualForum NNTP Server 1.5

10 май 12, 13:04    [12529464]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на символы в MS SQL  [new]
почему так?
Guest
daw,

теперь да, проканалось, но все равно не понимаю, почему.
блог SamMan про Collation прочитан и вроде понят (кроме правил сравнения, чей Collation победит)
в чем мистика-то? почему именно символ номера?
10 май 12, 13:30    [12529721]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на символы в MS SQL  [new]
step_ks
Member

Откуда:
Сообщений: 936
почему так?
daw,

теперь да, проканалось, но все равно не понимаю, почему.
блог SamMan про Collation прочитан и вроде понят (кроме правил сравнения, чей Collation победит)
в чем мистика-то? почему именно символ номера?

такой вот Collation by design, мож еще какие символы найдутся, если поискать.
10 май 12, 13:50    [12529888]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на символы в MS SQL  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
почему так?
в чем мистика-то?


Очина просто:
BOL, LIKE (Transact-SQL)
In range searches, the characters included in the range may vary depending on the sorting rules of the collation.


А поэтому если кто будет вам говорить "да я про LIKE все знаю" - смело посылайте его. Ни фига он про диапазоны ЛАЙК-а (те, что в квадратных скобках) не знает. И никто не знает кроме MS-программистов, что этот ЛАЙК писали. Потому что нет МАТЕМАТИЧЕСКОГО определения "диапазона", есть "интуитивный", я бы сказал. Который все как-раз типа "поняли". На самом же деле, в каждом конкретном случае диапазон определяется "по месту", исходя из нескольких факторов, один из которых (возможно - важнейший) как раз "финальный" коллейшен. Ну или единственный коллейшен, если в конкуренцию никто не вступает. Итого, в нашем примере, при коллейшене Cyrillic_General_CI_AS диапазон N-O состоит не из двух символов, как все думают, а из трех (и хорошо если из трех, мы еще не все символы попробовали, их и 20 может быть).

почему так?
кроме правил сравнения, чей Collation победит


Это что, мне по тому же вопросу (точнее - по тонкому нюансу этого вопроса) Microsoft Connect уже 2.5 месяца не отвечает, они сами не могут понять что они в BOL написали и как это интерпретировать правильно.
10 май 12, 18:06    [12532040]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить