powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Создание ограниченя на столбец
25 сообщений из 44, страница 1 из 2
Создание ограниченя на столбец
    #39953578
edward_sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, джентельмены!
Наставьте на путь истинный...
Есть в таблице два поля типа 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)?
...
Рейтинг: 0 / 0
Создание ограниченя на столбец
    #39953588
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edward_shПолучаю ошибку при сохранении...Чтобы исправить неизвестную ошибку, нужны неизвестные действия.edward_sh[fValDateEnd]=NULLДля проверки значения на null надо использовать оператор is null / is not nulledward_shИ попутный вопрос, как при вставке контролировать, чтобы дата начала работ была меньше или равна дате окончания работ (на уровне записи, с учетом NULL в поле DateEnd)?Создать соответствующий check constraint.
...
Рейтинг: 0 / 0
Создание ограниченя на столбец
    #39953589
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edward_sh
что отражено в конструкторе таблиц
Не пользоваться конструктором таблиц.
Пользоваться скриптами SQL и выполнять оные.
...
Рейтинг: 0 / 0
Создание ограниченя на столбец
    #39953612
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
...
Рейтинг: 0 / 0
Создание ограниченя на столбец
    #39953629
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
godsql
имхо, построитель глючит


да щас )
скорее у автора есть данные, не подпадающие под прописанные ограничения
...
Рейтинг: 0 / 0
Создание ограниченя на столбец
    #39953645
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 ??
...
Рейтинг: 0 / 0
Создание ограниченя на столбец
    #39953659
edward_sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пробовал и такую конструкцию как fValDateEnd is null
Результат был тот же самый. При попытке сохранить результаты правки, выходит сообщение, что текст ограничения содержит ошибки.
В Accesse есть возможность на каждое нарушение ограничения вывести свое соощение (в чем конкретно ошибка). В SQL так понимаю такого нет? Очень неинформативное сообщение о нарушении данных в ограничении ХХХХ базы такой-то.
Данные в столбцах таковы fValDateBegin = 2017-01-01, fValDateEnd = NULL во всех записях.
...
Рейтинг: 0 / 0
Создание ограниченя на столбец
    #39953666
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edward_sh
пробовал и такую конструкцию как fValDateEnd is null
Результат был тот же самый. При попытке сохранить результаты правки, выходит сообщение, что текст ограничения содержит ошибки.
В Accesse есть возможность на каждое нарушение ограничения вывести свое соощение (в чем конкретно ошибка). В SQL так понимаю такого нет? Очень неинформативное сообщение о нарушении данных в ограничении ХХХХ базы такой-то.
В сиквеле тоже очень информативные сообщения, жаль, что вы его не показали.
А то в вашем посте вы уже рассказали про 2 версии сообщения об ошибке:
1) ошибка в тексте ограничения
2) ошибка в данных таблицы
Неужели трудно просто скопировать?

edward_sh
Данные в столбцах таковы fValDateBegin = 2017-01-01, fValDateEnd = NULL во всех записях.
Вы лучше запрос покажите, и результат выполнения, не надо пересказывать слухи.
...
Рейтинг: 0 / 0
Создание ограниченя на столбец
    #39953667
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edward_sh
пробовал и такую конструкцию как fValDateEnd is null
Надо не пробовать, а использовать только такую форму.
А то у вас множество ошибок накладываются друг на друга, и отлаживать очень трудно.
...
Рейтинг: 0 / 0
Создание ограниченя на столбец
    #39953669
edward_sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Конструктор таблиц упорно не хотел сохранять ограничения, вопя об ошибке сохранения.
Убил эти ограничения и через ALTER все прекрасно сохранилось.
Попутно возник вопрос - у меня несколько таблиц, в которых содержатся аналогичные поля, на которые накладываются аналогичные ограничения. Есть ли возможность создать ОДНО ограничение для каждого столбца и применить его к разным таблицам?
Или лучше вынести проверку корректности данных в функцию и применять ее через триггер?
...
Рейтинг: 0 / 0
Создание ограниченя на столбец
    #39953678
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 ??

согласен :)
Скобки поправил в логике, а здесь не исправил :)
...
Рейтинг: 0 / 0
Создание ограниченя на столбец
    #39953680
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Создание ограниченя на столбец
    #39953796
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
edward_sh

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

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


:-)
...
Рейтинг: 0 / 0
Создание ограниченя на столбец
    #39953827
edward_sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alter table myTable With Check Check constraint myConstraint

Command(s) completed successfully.

Изменение в поле fValDateBegin (заранее неверное при ограничении) выдает ошибку вставки записи из-за сработавшего ограничения на поле.
...
Рейтинг: 0 / 0
Создание ограниченя на столбец
    #39960017
edward_sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Самое интересное, что если у поля поменять тип с date на datetime, ошибок SSMS при сохранении этого же ограничения не происходит.
Интересно, в чем фикус?
...
Рейтинг: 0 / 0
Создание ограниченя на столбец
    #39960042
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edward_sh,

условие проверки выполняется, какой тут фокус может быть.
...
Рейтинг: 0 / 0
Создание ограниченя на столбец
    #39960314
edward_sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,Владислав Колосов!
Не понятно, почему при работе в SSMS с полем типа datetime не вылетает ошибка, а при типе поля date появляется?
И попутный вопрос - не могу для себя выяснить правильное направление движения.
Использовать ли ограничения на значение столбцах или же использовать триггер?
...
Рейтинг: 0 / 0
Создание ограниченя на столбец
    #39960326
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edward_sh,

вылетает ошибка потому, что переданные значения не проходят проверку. Проверяйте формулу применительно к значению простым запросом. Уберите дефисы из строки даты, в таком написании дата трактуется неоднозначно, зависит от установленного языка сессии.
...
Рейтинг: 0 / 0
Создание ограниченя на столбец
    #39960350
edward_sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов, по Вашему совету убрал дефисы (хотя читал, что это тоже универсальный формат даты, не зависящий от языка)
([fValDateEnd] IS NULL OR [fValDateEnd]>='20170101' AND [fValDateEnd]<'20500101')
Все равно при сохранении вылетает ошибка "Error validating constraint. Do you want to edit..."
При смене на тип datetime этой ошибки нет, как впрочем и при вставке через командную строку...
А по второй части вопроса можете что-нибудь посоветовать?
...
Рейтинг: 0 / 0
Создание ограниченя на столбец
    #39960365
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edward_sh
Использовать ли ограничения на значение столбцах или же использовать триггер?
Конечно, ограничения.
edward_sh
Все равно при сохранении вылетает ошибка "Error validating constraint. Do you want to edit..."
Да проверьте уже данные запросом, неужели это так сложно?

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

И пишите и выкладывайте скрипты, результаты выполнения, а то получается, как секретарша: "я что то нажала а он не работает что мне делать".
...
Рейтинг: 0 / 0
Создание ограниченя на столбец
    #39960389
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edward_sh,

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

Код: sql
1.
select * from MyTable WHERE NOT ([fValDateEnd] IS NULL OR [fValDateEnd]>='20170101' AND [fValDateEnd]<'20500101')


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

Походу сервер не дает приложить файлы...
И еще попутный вопрос ....
У меня в нескольких таблицах в полях есть одинаковые ограничения на дату.
Что лучше, прописывать ограничения для каждой таблицы или создать функцию, где эти ограничения прописаны и применить эту функцию к необходимым столбцам всех нужных таблиц?
На всякий случай вывод @@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)

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

Ваши картинки никому не нужны. Текст команд и текст ошибок достаточно скопировать через буфер обмена.
...
Рейтинг: 0 / 0
Создание ограниченя на столбец
    #39960507
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edward_sh
Что лучше, прописывать ограничения для каждой таблицы или создать функцию, где эти ограничения прописаны и применить эту функцию к необходимым столбцам всех нужных таблиц?
Первое.
Владислав Колосов
edward_sh,

Выполните запрос
Код: sql
1.
select * from MyTable WHERE NOT ([fValDateEnd] IS NULL OR [fValDateEnd]>='20170101' AND [fValDateEnd]<'20500101')

, увидите, что мешает.
Ой, да лучше ещё 20 дней поспрашивать "у меня не работает".
...
Рейтинг: 0 / 0
Создание ограниченя на столбец
    #39960509
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edward_sh
Походу сервер не дает приложить файлы...
Копируйте прямо в пост команды определения констрейнов, запросы, результаты.
В теге SRC
...
Рейтинг: 0 / 0
25 сообщений из 44, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Создание ограниченя на столбец
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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