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

Откуда: Челябинск
Сообщений: 28
Добрый день, джентельмены!
Наставьте на путь истинный...
Есть в таблице два поля типа date
DateBegin и DateEnd, которые означают дату начала работы (например) и дату окончания работы.
Поле DateBegin не может принимать значение NULL, что отражено в конструкторе таблиц и не может быть ранее, допустим 01.01.2017. Поле DateEnd может принимать значение как NULL, так и некоторое значение даты, которая должна быть более (или равна) дате начала работы, но не более конечной даты.
Настиг вопрос, как написать правильные ограничения на столбцы дат.
1) Вставляю в поле ограничения для DateBegin следующее
([fValDateBegin]>='2017-01-01' AND [fValDateBegin]<'2050-01-01')
2) Вставляю в поле ограничения для DateEnd следующее
([fValDateEnd]=NULL OR [fValDateEnd]>='2017-01-01' AND [fValDateEnd]<'2050-01-01')

Получаю ошибку при сохранении...
И попутный вопрос, как при вставке контролировать, чтобы дата начала работ была меньше или равна дате окончания работ (на уровне записи, с учетом NULL в поле DateEnd)?

Сообщение было отредактировано: 1 май 20, 17:44
1 май 20, 17:44    [22126303]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36814
edward_sh
Получаю ошибку при сохранении...
Чтобы исправить неизвестную ошибку, нужны неизвестные действия.
edward_sh
[fValDateEnd]=NULL
Для проверки значения на null надо использовать оператор is null / is not null
edward_sh
И попутный вопрос, как при вставке контролировать, чтобы дата начала работ была меньше или равна дате окончания работ (на уровне записи, с учетом NULL в поле DateEnd)?
Создать соответствующий check constraint.
1 май 20, 18:24    [22126318]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
edward_sh
что отражено в конструкторе таблиц
Не пользоваться конструктором таблиц.
Пользоваться скриптами SQL и выполнять оные.
1 май 20, 18:31    [22126321]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
godsql
Member

Откуда:
Сообщений: 30
имхо, построитель глючит
попробуйте sql (логику не проверял) типа:

ALTER TABLE [dbo].[Tab]
add CONSTRAINT CHK_Column CHECK ([fValDateBegin]>='2017-01-01' AND [fValDateBegin]<'2050-01-01'),
CONSTRAINT CHK_Column2 CHECK ([fValDateEnd]=NULL OR ([fValDateEnd]>='2017-01-01' AND [fValDateEnd]<'2050-01-01'))
Go

Сообщение было отредактировано: 1 май 20, 20:59
1 май 20, 20:56    [22126382]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33364
Блог
godsql
имхо, построитель глючит


да щас )
скорее у автора есть данные, не подпадающие под прописанные ограничения
1 май 20, 21:40    [22126412]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
godsql
имхо, построитель глючит
попробуйте sql (логику не проверял) типа:

ALTER TABLE [dbo].[Tab]
add CONSTRAINT CHK_Column CHECK ([fValDateBegin]>='2017-01-01' AND [fValDateBegin]<'2050-01-01'),
CONSTRAINT CHK_Column2 CHECK ([fValDateEnd]=NULL OR ([fValDateEnd]>='2017-01-01' AND [fValDateEnd]<'2050-01-01'))
Go
Что по-вашему вернёт [fValDateEnd]=NULL??
1 май 20, 23:41    [22126450]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
edward_sh
Member

Откуда: Челябинск
Сообщений: 28
пробовал и такую конструкцию как fValDateEnd is null
Результат был тот же самый. При попытке сохранить результаты правки, выходит сообщение, что текст ограничения содержит ошибки.
В Accesse есть возможность на каждое нарушение ограничения вывести свое соощение (в чем конкретно ошибка). В SQL так понимаю такого нет? Очень неинформативное сообщение о нарушении данных в ограничении ХХХХ базы такой-то.
Данные в столбцах таковы fValDateBegin = 2017-01-01, fValDateEnd = NULL во всех записях.
2 май 20, 07:05    [22126483]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31205
edward_sh
пробовал и такую конструкцию как fValDateEnd is null
Результат был тот же самый. При попытке сохранить результаты правки, выходит сообщение, что текст ограничения содержит ошибки.
В Accesse есть возможность на каждое нарушение ограничения вывести свое соощение (в чем конкретно ошибка). В SQL так понимаю такого нет? Очень неинформативное сообщение о нарушении данных в ограничении ХХХХ базы такой-то.
В сиквеле тоже очень информативные сообщения, жаль, что вы его не показали.
А то в вашем посте вы уже рассказали про 2 версии сообщения об ошибке:
1) ошибка в тексте ограничения
2) ошибка в данных таблицы
Неужели трудно просто скопировать?

edward_sh
Данные в столбцах таковы fValDateBegin = 2017-01-01, fValDateEnd = NULL во всех записях.
Вы лучше запрос покажите, и результат выполнения, не надо пересказывать слухи.
2 май 20, 09:04    [22126510]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31205
edward_sh
пробовал и такую конструкцию как fValDateEnd is null
Надо не пробовать, а использовать только такую форму.
А то у вас множество ошибок накладываются друг на друга, и отлаживать очень трудно.
2 май 20, 09:05    [22126511]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
edward_sh
Member

Откуда: Челябинск
Сообщений: 28
Конструктор таблиц упорно не хотел сохранять ограничения, вопя об ошибке сохранения.
Убил эти ограничения и через ALTER все прекрасно сохранилось.
Попутно возник вопрос - у меня несколько таблиц, в которых содержатся аналогичные поля, на которые накладываются аналогичные ограничения. Есть ли возможность создать ОДНО ограничение для каждого столбца и применить его к разным таблицам?
Или лучше вынести проверку корректности данных в функцию и применять ее через триггер?

Сообщение было отредактировано: 2 май 20, 09:36
2 май 20, 09:31    [22126522]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
godsql
Member

Откуда:
Сообщений: 30
iap
godsql
имхо, построитель глючит
попробуйте sql (логику не проверял) типа:

ALTER TABLE [dbo].[Tab]
add CONSTRAINT CHK_Column CHECK ([fValDateBegin]>='2017-01-01' AND [fValDateBegin]<'2050-01-01'),
CONSTRAINT CHK_Column2 CHECK ([fValDateEnd]=NULL OR ([fValDateEnd]>='2017-01-01' AND [fValDateEnd]<'2050-01-01'))
Go
Что по-вашему вернёт [fValDateEnd]=NULL??

согласен :)
Скобки поправил в логике, а здесь не исправил :)
2 май 20, 12:09    [22126560]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
godsql
iap
пропущено...
Что по-вашему вернёт [fValDateEnd]=NULL??

согласен :)
Скобки поправил в логике, а здесь не исправил :)
Я спросил, что вернёт это логическое выражение. Так и не ответили...
https://docs.microsoft.com/ru-ru/sql/t-sql/language-elements/null-and-unknown-transact-sql?view=sql-server-2017

В констрейнте CHECK надо, чтобы выражение не вернуло FALSE.
В отличие от выражений в WHERE или ON, которые пропускают только записи, для которых получается TRUE.

Сообщение было отредактировано: 2 май 20, 12:25
2 май 20, 12:23    [22126569]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
uaggster
Member

Откуда:
Сообщений: 796
edward_sh

Убил эти ограничения и через ALTER все прекрасно сохранилось.

Ну ды щаз, конечно!
Ты просто создал недоверенный констрейнт.
Теперь проверь его!
Alter table myTable With Check Check constraint myConstraint

:-)
2 май 20, 21:46    [22126791]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
edward_sh
Member

Откуда: Челябинск
Сообщений: 28
Alter table myTable With Check Check constraint myConstraint

Command(s) completed successfully.

Изменение в поле fValDateBegin (заранее неверное при ограничении) выдает ошибку вставки записи из-за сработавшего ограничения на поле.

Сообщение было отредактировано: 3 май 20, 07:33
3 май 20, 07:33    [22126840]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
edward_sh
Member

Откуда: Челябинск
Сообщений: 28
Самое интересное, что если у поля поменять тип с date на datetime, ошибок SSMS при сохранении этого же ограничения не происходит.
Интересно, в чем фикус?
20 май 20, 18:32    [22136611]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
Владислав Колосов
Member

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

условие проверки выполняется, какой тут фокус может быть.
20 май 20, 19:10    [22136641]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
edward_sh
Member

Откуда: Челябинск
Сообщений: 28
Добрый день,Владислав Колосов!
Не понятно, почему при работе в SSMS с полем типа datetime не вылетает ошибка, а при типе поля date появляется?
И попутный вопрос - не могу для себя выяснить правильное направление движения.
Использовать ли ограничения на значение столбцах или же использовать триггер?
21 май 20, 15:10    [22137093]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
Владислав Колосов
Member

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

вылетает ошибка потому, что переданные значения не проходят проверку. Проверяйте формулу применительно к значению простым запросом. Уберите дефисы из строки даты, в таком написании дата трактуется неоднозначно, зависит от установленного языка сессии.
21 май 20, 15:44    [22137118]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
edward_sh
Member

Откуда: Челябинск
Сообщений: 28
Владислав Колосов, по Вашему совету убрал дефисы (хотя читал, что это тоже универсальный формат даты, не зависящий от языка)
([fValDateEnd] IS NULL OR [fValDateEnd]>='20170101' AND [fValDateEnd]<'20500101')
Все равно при сохранении вылетает ошибка "Error validating constraint. Do you want to edit..."
При смене на тип datetime этой ошибки нет, как впрочем и при вставке через командную строку...
А по второй части вопроса можете что-нибудь посоветовать?
21 май 20, 16:50    [22137168]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31205
edward_sh
Использовать ли ограничения на значение столбцах или же использовать триггер?
Конечно, ограничения.
edward_sh
Все равно при сохранении вылетает ошибка "Error validating constraint. Do you want to edit..."
Да проверьте уже данные запросом, неужели это так сложно?

Повторю ещё раз:
alexeyvg
edward_sh
Данные в столбцах таковы fValDateBegin = 2017-01-01, fValDateEnd = NULL во всех записях.
Вы лучше запрос покажите, и результат выполнения, не надо пересказывать слухи.


И пишите и выкладывайте скрипты, результаты выполнения, а то получается, как секретарша: "я что то нажала а он не работает что мне делать".
21 май 20, 17:11    [22137184]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
Владислав Колосов
Member

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

Выполните запрос

select * from MyTable WHERE NOT ([fValDateEnd] IS NULL OR [fValDateEnd]>='20170101' AND [fValDateEnd]<'20500101')

, увидите, что мешает.
21 май 20, 17:39    [22137210]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
edward_sh
Member

Откуда: Челябинск
Сообщений: 28
Выкладываю скрины....

Походу сервер не дает приложить файлы...
И еще попутный вопрос ....
У меня в нескольких таблицах в полях есть одинаковые ограничения на дату.
Что лучше, прописывать ограничения для каждой таблицы или создать функцию, где эти ограничения прописаны и применить эту функцию к необходимым столбцам всех нужных таблиц?
На всякий случай вывод @@Version
Microsoft SQL Server 2008 R2 (SP3) - 10.50.6220.0 (X64) Mar 19 2015 12:32:14 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

Модератор: Вложение удалено.


Сообщение было отредактировано: 21 май 20, 22:11
21 май 20, 18:41    [22137251]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
Гавриленко Сергей Алексеевич
Member

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

Ваши картинки никому не нужны. Текст команд и текст ошибок достаточно скопировать через буфер обмена.
21 май 20, 22:13    [22137364]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31205
edward_sh
Что лучше, прописывать ограничения для каждой таблицы или создать функцию, где эти ограничения прописаны и применить эту функцию к необходимым столбцам всех нужных таблиц?
Первое.
Владислав Колосов
edward_sh,

Выполните запрос
select * from MyTable WHERE NOT ([fValDateEnd] IS NULL OR [fValDateEnd]>='20170101' AND [fValDateEnd]<'20500101')
, увидите, что мешает.
Ой, да лучше ещё 20 дней поспрашивать "у меня не работает".
21 май 20, 23:23    [22137386]     Ответить | Цитировать Сообщить модератору
 Re: Создание ограниченя на столбец  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31205
edward_sh
Походу сервер не дает приложить файлы...
Копируйте прямо в пост команды определения констрейнов, запросы, результаты.
В теге SRC
21 май 20, 23:25    [22137388]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить