powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Ограничения и регулярные выражения
25 сообщений из 26, страница 1 из 2
Ограничения и регулярные выражения
    #39903799
IvKor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно создать текстовое поле в таблице формата "аа-0000аааа" необязательные: 2 заглавных русских буквы и тире,
обязательные: 4 цифры,
далее любые строчные буквы и цифры

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

Несколько дней уже бьюсь с этим, голова вообще не соображает. Кто подобные задачи решал?
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39903805
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IvKor

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


У вас есть набор правил, которые только вам известны. Сервер уж точно не знает куда вам там вставить сс или 08. Вам придется ему это сказать. Все эти правила разбора. Ни про какой fuzzy logic тем более не на поиск, а на шаблон, из коробки в сервере я лично не слышал.
Так что скорее всего тут поможет только ХП с разбором вашей строки. Или лучше такое в приложение выносить, а в базе данных хранить данные.
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39903807
IvKor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PizzaPizza, а нельзя никак в ограничении шаблон разделить на 3 части? (до чисел, число и после чисел). С помощью того же LIKE? С регулярными выражениями в бд вообще почти не работал,а гугл ничего толкового мне не выдаёт.
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39903808
IvKor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PizzaPizza, да и некоторые предлагают проверять формат и либо через кейс или через готу выбирать разные варианты форматирования, но и это я не понимаю как сделать.
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39903809
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
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
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39903811
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kopelly
Код: sql
1.
declare @C_Number varchar(50) = 'c80бис45Yu'



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

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

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

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


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

char(2)
int
varchar(max)
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39903995
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IvKor,

для этого и придуманы CLR функции.
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39905041
IvKor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kopelly,

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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
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



На синтаксис не ругается, но при добавлении или изменении строки выводит следующее. Что я делаю не так?
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39905050
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IvKorЧто я делаю не так?Модифицируете данные в графическом интерфейсе, а не запросами.

Ну и надо написать после begin в триггере в начале set nocount on
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39905109
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IvKor
Код: sql
1.
if @Post = NULL

И какой же вы ожидаете результат?
Поле testt во всей таблице test апдейтите на @C_Number. Какой же в этом глубокий смысл?
Вы знаете, что такое deleted и inserted?
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39905117
IvKor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич,

Добавил в начале
Код: sql
1.
SET @C_Number = (SELECT testt FROM test)



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

теперь он выдает вот что
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39905123
IvKor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap
IvKor
Код: sql
1.
if @Post = NULL


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



В том что после этих манипуляций присваивается значение @C_Number строке. Разве так нельзя?
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39905124
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IvKor
Добавил в начале
Код: sql
1.
SET @C_Number = (SELECT testt FROM test)

А какая запись из таблицы test должна оказаться в переменной?
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39905125
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IvKor
iap
пропущено...

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



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

Что ещё вы ожидали от команды
Код: sql
1.
UPDATE test SET testt = @C_Number

?
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39905127
IvKor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,

Та которую добавляет\изменяет пользователь
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39905128
IvKor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,

Тогда как конкретно указать ему ту строку которую пользователь добавляет или изменяет? Я понимаю что глупости спрашиваю, но я только начинаю разбираться в sql...Прошу меня извинить.
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39905129
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IvKor
alexeyvg,

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


Если вы выполните эту команду в SSMS, то обновится одна запись, "Та которую добавляет\изменяет пользователь"?
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39905130
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IvKor
alexeyvg,

Тогда как конкретно указать ему ту строку которую пользователь добавляет или изменяет? Я понимаю что глупости спрашиваю, но я только начинаю разбираться в sql...Прошу меня извинить.
КОнкретная строка, которую пользователь добавляет или изменяет, доступна в триггере в псевдотаблицах inserted/deleted
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39905132
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
IvKor
alexeyvg,

Тогда как конкретно указать ему ту строку которую пользователь добавляет или изменяет? Я понимаю что глупости спрашиваю, но я только начинаю разбираться в sql...Прошу меня извинить.
КОнкретная строка, которую пользователь добавляет или изменяет, доступна в триггере в псевдотаблицах inserted/deleted
Точнее, не строка, а строки, их может быть от 0 до полного количества записей в таблице.
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39905135
IvKor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,

так, и как это посмотреть? я сейчас совсем запутался...
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39905148
IvKor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
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



Но тут возникла проблема. Когда я не ввожу буквы до и/или после чисел он выдает ту же ошибку... как это исправить?
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39905161
IvKor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IvKor,

Ошибка выскакивает когда я ввожу вторую строку
Первая строка срабатывает как нужно
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39905185
IvKor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IvKor,

Я так понял что в запросе
Код: sql
1.
UPDATE test SET testt = @C_Number FROM test WHERE test.id = 2

необходимо указать какую строку мы изменяем.... и как указать именно ту строку которую мы изменяем или добавляем?
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39905367
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IvKor,

используйте таблицу inserted для выбора строк.
...
Рейтинг: 0 / 0
Ограничения и регулярные выражения
    #39905541
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IvKor,

и перестаньте сравнивать с NULL оператором "=".
Я же не просто так написал вам. Перечитайте.
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Ограничения и регулярные выражения
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]