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

Откуда:
Сообщений: 13
Нужно создать текстовое поле в таблице формата "аа-0000аааа" необязательные: 2 заглавных русских буквы и тире,
обязательные: 4 цифры,
далее любые строчные буквы и цифры

В триггере при вводе и редактировании проверять формат скважины, если не подходит, то по возможности корректировать.
Например: 8 -> 0008, 80бис -> 0080бис, с-80->С-0080,СС80->СС-0080, С80->С-0080.

Несколько дней уже бьюсь с этим, голова вообще не соображает. Кто подобные задачи решал?
17 дек 19, 02:37    [22041715]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
IvKor

Например: 8 -> 0008, 80бис -> 0080бис, с-80->С-0080,СС80->СС-0080, С80->С-0080.


У вас есть набор правил, которые только вам известны. Сервер уж точно не знает куда вам там вставить сс или 08. Вам придется ему это сказать. Все эти правила разбора. Ни про какой fuzzy logic тем более не на поиск, а на шаблон, из коробки в сервере я лично не слышал.
Так что скорее всего тут поможет только ХП с разбором вашей строки. Или лучше такое в приложение выносить, а в базе данных хранить данные.
17 дек 19, 05:26    [22041727]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
IvKor
Member

Откуда:
Сообщений: 13
PizzaPizza, а нельзя никак в ограничении шаблон разделить на 3 части? (до чисел, число и после чисел). С помощью того же LIKE? С регулярными выражениями в бд вообще почти не работал,а гугл ничего толкового мне не выдаёт.
17 дек 19, 05:41    [22041730]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
IvKor
Member

Откуда:
Сообщений: 13
PizzaPizza, да и некоторые предлагают проверять формат и либо через кейс или через готу выбирать разные варианты форматирования, но и это я не понимаю как сделать.
17 дек 19, 05:45    [22041732]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
declare @C_Number varchar(50) = 'c80бис45Yu'
Declare @Pred varchar(50)
Declare @Numeric varchar(50)
Declare @Post varchar(50)

select @Pred= upper(left(@C_Number,PATINDEX('%[0-9]%',@C_Number)-1)), @C_Number = SUBSTRING(@C_Number,PATINDEX('%[0-9]%',@C_Number),50) 
select @Numeric= left(@C_Number,PATINDEX('%[^0-9]%',@C_Number)-1), @Post = SUBSTRING(@C_Number,PATINDEX('%[^0-9]%',@C_Number),50) 

select @Pred = @Pred + '-' WHere @Pred not like '%-'

Select @Pred,@Numeric,@Post

if @Pred not like '[A-ZА-Я]-' and @Pred not like '[A-ZА-Я][A-ZА-Я]-'
begin
   print 'Неправильный формат предиката'
End 

if len(@Numeric)>4
begin
   print 'Неправильный формат номера'
End 

if @Post like '%[^A-Za-zА-Яа-я0-9]%'
begin
   print 'Неправильный формат окончания'
End 


Set @C_Number = @Pred + right('0000'+@Numeric,4)  + @Post
17 дек 19, 06:18    [22041734]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
aleks222
Member

Откуда:
Сообщений: 847
Kopelly
declare @C_Number varchar(50) = 'c80бис45Yu'


Можно, конечно, компьютером гвозди забивать.

IvKor
Нужно создать текстовое поле в таблице формата "аа-0000аааа" необязательные:

1. 2 заглавных русских буквы,
2. обязательные: 4 цифры,
3. далее любые строчные буквы и цифры

Несколько дней уже бьюсь с этим, голова вообще не соображает. Кто подобные задачи решал?


Проще надо быть.
3(три) поля спасут отца русской демократии.

char(2)
int
varchar(max)
17 дек 19, 06:30    [22041737]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7383
IvKor,

для этого и придуманы CLR функции.
17 дек 19, 12:20    [22041999]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
IvKor
Member

Откуда:
Сообщений: 13
Kopelly,

Ох спасибо милый человек, очень выручили!

Только есть вопрос:
Написал триггер на основе того что вы прислали. Немного подкорректировав его

ALTER TRIGGER autokor ON test
   FOR INSERT,UPDATE
AS 
BEGIN
DECLARE @C_Number VARCHAR(50) 
DECLARE @Pred VARCHAR(2)
DECLARE @Numeric VARCHAR(4)
DECLARE @Post VARCHAR(50)

SELECT @Pred= UPPER(left(@C_Number,PATINDEX('%[0-9]%',@C_Number)-1)), @C_Number = SUBSTRING(@C_Number,PATINDEX('%[0-9]%',@C_Number),50) 
SELECT @Numeric= left(@C_Number,PATINDEX('%[^0-9]%',@C_Number)-1), @Post = SUBSTRING(@C_Number,PATINDEX('%[^0-9]%',@C_Number),50) 
SELECT @Pred = @Pred + '-' WHere @Pred not like '%-' AND @Pred = ''

SELECT @Pred,@Numeric,@Post

if @Pred not like '[A-ZА-Я]-' and @Pred not like '[A-ZА-Я][A-ZА-Я]-'
begin
   SET @Pred = ''
End 

if @Post = NULL
begin
   SET @Post = ''
End 

if len(@Numeric)>4 or len(@Numeric)=0
begin
   SET @Numeric = '0000'
End 

if @Post like '%[^A-Za-zА-Яа-я0-9]%'
begin
   SET @Post = ''
End 

SET @C_Number = @Pred + right('0000'+@Numeric,4) + @Post

UPDATE test SET testt = @C_Number
END


На синтаксис не ругается, но при добавлении или изменении строки выводит следующее. Что я делаю не так?

К сообщению приложен файл. Размер - 12Kb
18 дек 19, 19:55    [22043569]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36686
IvKor
Что я делаю не так?
Модифицируете данные в графическом интерфейсе, а не запросами.

Ну и надо написать после begin в триггере в начале set nocount on

Сообщение было отредактировано: 18 дек 19, 20:15
18 дек 19, 20:15    [22043578]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
IvKor
if @Post = NULL
И какой же вы ожидаете результат?
Поле testt во всей таблице test апдейтите на @C_Number. Какой же в этом глубокий смысл?
Вы знаете, что такое deleted и inserted?
18 дек 19, 21:55    [22043644]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
IvKor
Member

Откуда:
Сообщений: 13
Гавриленко Сергей Алексеевич,

Добавил в начале
SET @C_Number = (SELECT testt FROM test)


set nocount on как вы и сказали.

теперь он выдает вот что

К сообщению приложен файл. Размер - 19Kb
18 дек 19, 22:09    [22043656]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
IvKor
Member

Откуда:
Сообщений: 13
iap
IvKor
if @Post = NULL

Поле testt во всей таблице test апдейтите на @C_Number. Какой же в этом глубокий смысл??



В том что после этих манипуляций присваивается значение @C_Number строке. Разве так нельзя?
18 дек 19, 22:14    [22043664]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30702
IvKor
Добавил в начале
SET @C_Number = (SELECT testt FROM test)
А какая запись из таблицы test должна оказаться в переменной?
18 дек 19, 22:16    [22043667]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30702
IvKor
iap
пропущено...

Поле testt во всей таблице test апдейтите на @C_Number. Какой же в этом глубокий смысл??



В том что после этих манипуляций присваивается значение @C_Number строке. Разве так нельзя?
Не строке, а всем строкам таблицы test

Что ещё вы ожидали от команды
UPDATE test SET testt = @C_Number
?
18 дек 19, 22:17    [22043669]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
IvKor
Member

Откуда:
Сообщений: 13
alexeyvg,

Та которую добавляет\изменяет пользователь
18 дек 19, 22:20    [22043673]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
IvKor
Member

Откуда:
Сообщений: 13
alexeyvg,

Тогда как конкретно указать ему ту строку которую пользователь добавляет или изменяет? Я понимаю что глупости спрашиваю, но я только начинаю разбираться в sql...Прошу меня извинить.
18 дек 19, 22:21    [22043674]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30702
IvKor
alexeyvg,

Та которую добавляет\изменяет пользователь
И где это указано в команде
UPDATE test SET testt = @C_Number

Если вы выполните эту команду в SSMS, то обновится одна запись, "Та которую добавляет\изменяет пользователь"?
18 дек 19, 22:22    [22043676]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30702
IvKor
alexeyvg,

Тогда как конкретно указать ему ту строку которую пользователь добавляет или изменяет? Я понимаю что глупости спрашиваю, но я только начинаю разбираться в sql...Прошу меня извинить.
КОнкретная строка, которую пользователь добавляет или изменяет, доступна в триггере в псевдотаблицах inserted/deleted
18 дек 19, 22:24    [22043678]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30702
alexeyvg
IvKor
alexeyvg,

Тогда как конкретно указать ему ту строку которую пользователь добавляет или изменяет? Я понимаю что глупости спрашиваю, но я только начинаю разбираться в sql...Прошу меня извинить.
КОнкретная строка, которую пользователь добавляет или изменяет, доступна в триггере в псевдотаблицах inserted/deleted
Точнее, не строка, а строки, их может быть от 0 до полного количества записей в таблице.
18 дек 19, 22:25    [22043680]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
IvKor
Member

Откуда:
Сообщений: 13
alexeyvg,

так, и как это посмотреть? я сейчас совсем запутался...
18 дек 19, 22:34    [22043685]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
IvKor
Member

Откуда:
Сообщений: 13
alexeyvg,

РАЗОБРАЛСЯ!
хотя получился костыль...
вот может кому то пригодится)

ALTER TRIGGER autokor ON test
   FOR INSERT,UPDATE
AS 
BEGIN
SET NOCOUNT ON
DECLARE @C_Number VARCHAR(50) 
SET @C_Number = (SELECT testt FROM test)
DECLARE @Pred VARCHAR(3)
DECLARE @Numeric VARCHAR(4)
DECLARE @Post VARCHAR(50)

SELECT @Pred= UPPER(left(@C_Number,PATINDEX('%[0-9]%',@C_Number)-1)), @C_Number = SUBSTRING(@C_Number,PATINDEX('%[0-9]%',@C_Number),50) 
SELECT @Numeric= left(@C_Number,PATINDEX('%[^0-9]%',@C_Number)-1), @Post = SUBSTRING(@C_Number,PATINDEX('%[^0-9]%',@C_Number),50) 
SELECT @Pred = @Pred + '-' WHere @Pred not like '%-' 

SELECT @Pred,@Numeric,@Post

if @Pred not like '[A-ZА-Я]-' and @Pred not like '[A-ZА-Я][A-ZА-Я]-'
begin
   SET @Pred = ''
End 

if @Post = NULL
begin
   SET @Post = ''
End 

if len(@Numeric)>4 or len(@Numeric)=0
begin
   SET @Numeric = '0000'
End 

if @Post not like '%[^A-Za-zА-Яа-я0-9]%'
begin
   SET @Post = ''
End 

SET @C_Number = @Pred + right('0000'+@Numeric,4) + @Post

UPDATE test SET testt = @C_Number FROM test WHERE test.id = test.id
END


Но тут возникла проблема. Когда я не ввожу буквы до и/или после чисел он выдает ту же ошибку... как это исправить?

Сообщение было отредактировано: 18 дек 19, 22:59
18 дек 19, 22:56    [22043704]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
IvKor
Member

Откуда:
Сообщений: 13
IvKor,

Ошибка выскакивает когда я ввожу вторую строку
Первая строка срабатывает как нужно
18 дек 19, 23:23    [22043732]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
IvKor
Member

Откуда:
Сообщений: 13
IvKor,

Я так понял что в запросе
UPDATE test SET testt = @C_Number FROM test WHERE test.id = 2
необходимо указать какую строку мы изменяем.... и как указать именно ту строку которую мы изменяем или добавляем?
19 дек 19, 01:57    [22043790]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7383
IvKor,

используйте таблицу inserted для выбора строк.
19 дек 19, 11:48    [22044063]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения и регулярные выражения  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
IvKor,

и перестаньте сравнивать с NULL оператором "=".
Я же не просто так написал вам. Перечитайте.
19 дек 19, 14:06    [22044318]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить