Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
IvKor Member Откуда: Сообщений: 13 |
Нужно создать текстовое поле в таблице формата "аа-0000аааа" необязательные: 2 заглавных русских буквы и тире, обязательные: 4 цифры, далее любые строчные буквы и цифры В триггере при вводе и редактировании проверять формат скважины, если не подходит, то по возможности корректировать. Например: 8 -> 0008, 80бис -> 0080бис, с-80->С-0080,СС80->СС-0080, С80->С-0080. Несколько дней уже бьюсь с этим, голова вообще не соображает. Кто подобные задачи решал? |
17 дек 19, 02:37 [22041715] Ответить | Цитировать Сообщить модератору |
PizzaPizza Member Откуда: Сообщений: 414 |
У вас есть набор правил, которые только вам известны. Сервер уж точно не знает куда вам там вставить сс или 08. Вам придется ему это сказать. Все эти правила разбора. Ни про какой fuzzy logic тем более не на поиск, а на шаблон, из коробки в сервере я лично не слышал. Так что скорее всего тут поможет только ХП с разбором вашей строки. Или лучше такое в приложение выносить, а в базе данных хранить данные. |
||||
17 дек 19, 05:26 [22041727] Ответить | Цитировать Сообщить модератору |
IvKor Member Откуда: Сообщений: 13 |
PizzaPizza, а нельзя никак в ограничении шаблон разделить на 3 части? (до чисел, число и после чисел). С помощью того же LIKE? С регулярными выражениями в бд вообще почти не работал,а гугл ничего толкового мне не выдаёт. |
17 дек 19, 05:41 [22041730] Ответить | Цитировать Сообщить модератору |
IvKor Member Откуда: Сообщений: 13 |
PizzaPizza, да и некоторые предлагают проверять формат и либо через кейс или через готу выбирать разные варианты форматирования, но и это я не понимаю как сделать. |
17 дек 19, 05:45 [22041732] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
aleks222 Member Откуда: Сообщений: 1232 |
Можно, конечно, компьютером гвозди забивать.
Проще надо быть. 3(три) поля спасут отца русской демократии. char(2) int varchar(max) |
||||||||
17 дек 19, 06:30 [22041737] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8300 |
IvKor, для этого и придуманы CLR функции. |
17 дек 19, 12:20 [22041999] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37138 |
Ну и надо написать после begin в триггере в начале set nocount on Сообщение было отредактировано: 18 дек 19, 20:15 |
||
18 дек 19, 20:15 [22043578] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
Поле testt во всей таблице test апдейтите на @C_Number. Какой же в этом глубокий смысл? Вы знаете, что такое deleted и inserted? |
||||
18 дек 19, 21:55 [22043644] Ответить | Цитировать Сообщить модератору |
IvKor Member Откуда: Сообщений: 13 |
Гавриленко Сергей Алексеевич, Добавил в начале SET @C_Number = (SELECT testt FROM test) set nocount on как вы и сказали. теперь он выдает вот что К сообщению приложен файл. Размер - 19Kb |
18 дек 19, 22:09 [22043656] Ответить | Цитировать Сообщить модератору |
IvKor Member Откуда: Сообщений: 13 |
В том что после этих манипуляций присваивается значение @C_Number строке. Разве так нельзя? |
||||||||
18 дек 19, 22:14 [22043664] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31778 |
|
||||
18 дек 19, 22:16 [22043667] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31778 |
Что ещё вы ожидали от команды UPDATE test SET testt = @C_Number? |
||||||||
18 дек 19, 22:17 [22043669] Ответить | Цитировать Сообщить модератору |
IvKor Member Откуда: Сообщений: 13 |
alexeyvg, Та которую добавляет\изменяет пользователь |
18 дек 19, 22:20 [22043673] Ответить | Цитировать Сообщить модератору |
IvKor Member Откуда: Сообщений: 13 |
alexeyvg, Тогда как конкретно указать ему ту строку которую пользователь добавляет или изменяет? Я понимаю что глупости спрашиваю, но я только начинаю разбираться в sql...Прошу меня извинить. |
18 дек 19, 22:21 [22043674] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31778 |
UPDATE test SET testt = @C_Number Если вы выполните эту команду в SSMS, то обновится одна запись, "Та которую добавляет\изменяет пользователь"? |
||||
18 дек 19, 22:22 [22043676] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31778 |
|
||||
18 дек 19, 22:24 [22043678] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31778 |
|
||||||||
18 дек 19, 22:25 [22043680] Ответить | Цитировать Сообщить модератору |
IvKor Member Откуда: Сообщений: 13 |
alexeyvg, так, и как это посмотреть? я сейчас совсем запутался... |
18 дек 19, 22:34 [22043685] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
IvKor Member Откуда: Сообщений: 13 |
IvKor, Ошибка выскакивает когда я ввожу вторую строку Первая строка срабатывает как нужно |
18 дек 19, 23:23 [22043732] Ответить | Цитировать Сообщить модератору |
IvKor Member Откуда: Сообщений: 13 |
IvKor, Я так понял что в запросе UPDATE test SET testt = @C_Number FROM test WHERE test.id = 2необходимо указать какую строку мы изменяем.... и как указать именно ту строку которую мы изменяем или добавляем? |
19 дек 19, 01:57 [22043790] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8300 |
IvKor, используйте таблицу inserted для выбора строк. |
19 дек 19, 11:48 [22044063] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
IvKor, и перестаньте сравнивать с NULL оператором "=". Я же не просто так написал вам. Перечитайте. |
19 дек 19, 14:06 [22044318] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |