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

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

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

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


У вас есть набор правил, которые только вам известны. Сервер уж точно не знает куда вам там вставить сс или 08. Вам придется ему это сказать. Все эти правила разбора. Ни про какой fuzzy logic тем более не на поиск, а на шаблон, из коробки в сервере я лично не слышал.
Так что скорее всего тут поможет только ХП с разбором вашей строки. Или лучше такое в приложение выносить, а в базе данных хранить данные.
...
Рейтинг: 0 / 0
17.12.2019, 05:41
    #39903807
IvKor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничения и регулярные выражения
PizzaPizza, а нельзя никак в ограничении шаблон разделить на 3 части? (до чисел, число и после чисел). С помощью того же LIKE? С регулярными выражениями в бд вообще почти не работал,а гугл ничего толкового мне не выдаёт.
...
Рейтинг: 0 / 0
17.12.2019, 05:45
    #39903808
IvKor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничения и регулярные выражения
PizzaPizza, да и некоторые предлагают проверять формат и либо через кейс или через готу выбирать разные варианты форматирования, но и это я не понимаю как сделать.
...
Рейтинг: 0 / 0
17.12.2019, 06:18
    #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
17.12.2019, 06:30
    #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
17.12.2019, 12:20
    #39903995
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничения и регулярные выражения
IvKor,

для этого и придуманы CLR функции.
...
Рейтинг: 0 / 0
18.12.2019, 19:55
    #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
18.12.2019, 20:15
    #39905050
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничения и регулярные выражения
IvKorЧто я делаю не так?Модифицируете данные в графическом интерфейсе, а не запросами.

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

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

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



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

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


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



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

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

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



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

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

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

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

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

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


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

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

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

так, и как это посмотреть? я сейчас совсем запутался...
...
Рейтинг: 0 / 0
18.12.2019, 22:56
    #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
18.12.2019, 23:23
    #39905161
IvKor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничения и регулярные выражения
IvKor,

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

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

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

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

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


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