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

Откуда: Украина, Донецк
Сообщений: 61
Подскажите пожалуйста, как сделать ограничение CHECK на дату из другой таблицы?

Есть таблица, Билеты и есть Рейсы, мне нужно чтобы дата покупки билета была не больше чем дата вылета в Рейсах (сами понимаете, не комильфо билеты после вылета самолета покупать)
22 дек 12, 02:11    [13669825]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение на дату  [new]
aleks2
Guest
1. UDF в констрейнт.
2 в UDF проверяй чо хошь.
22 дек 12, 07:35    [13670079]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение на дату  [new]
One_question
Member

Откуда: Украина, Донецк
Сообщений: 61
aleks2, Если я не ошибаюсь, мы это имели ввиду?

USE Аэропорт
GO

ALTER FUNCTION dbo.DATETRIM (@date datetime)
RETURNS datetime
AS
BEGIN
	RETURN CAST(@date AS DATE)
END


и вызов

USE Аэропорт
GO

ALTER TABLE [dbo].[тГрузы]  WITH CHECK ADD  CONSTRAINT [тГрузы_Проверка даты] CHECK  (Дата_заказа <= DATETRIM (dbo.тРейсы.Время_вылета_факт))
GO


Но у меня выскакиевает ошибка
Сообщение 195, уровень 15, состояние 10, строка 2
DATETRIM не является известным имя встроенной функции.
22 дек 12, 13:50    [13670492]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение на дату  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33955
Блог
dbo.функция
22 дек 12, 16:38    [13670950]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение на дату  [new]
aleks2
Guest
Критик
dbo.функция

Не. У тредстартера более глобальное непонимание.

-- я косею от этого зоопарка.

CREATE FUNCTION dbo.CheckDATE (@date datetime, @flightID int)
RETURNS bit
AS
BEGIN
	RETURN case when @date <= (select top(1) Время_вылета_факт from dbo.тРейсы where flightID = @flightID) then 1
	            else 0
	       end;
END

go

ALTER TABLE [dbo].[тГрузы]  WITH CHECK ADD  CONSTRAINT [тГрузы_Проверка даты] CHECK  dbo.CheckDATE(Дата_заказа, Рейс ) = 1
GO
22 дек 12, 16:41    [13670953]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение на дату  [new]
One_question
Member

Откуда: Украина, Донецк
Сообщений: 61
aleks2, Пишет Неправильный синтаксис около конструкции "dbo"
возле CHECK dbo.CheckDATE
22 дек 12, 16:50    [13670988]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение на дату  [new]
aleks2
Guest
Как он беспомощен...
ALTER TABLE [dbo].[тГрузы]  WITH CHECK ADD  CONSTRAINT [тГрузы_Проверка даты] CHECK  (dbo.CheckDATE(Дата_заказа, Рейс ) = 1)
22 дек 12, 17:07    [13671040]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение на дату  [new]
One_question
Member

Откуда: Украина, Донецк
Сообщений: 61
aleks2,простите но к сожалению я не обладаю достаточным количеством опыта чтобы понять как сделать правильно, Ваш вариант был испробован.. и он снова выдает ошибку

Сообщение 547, уровень 16, состояние 0, строка 3
Конфликт инструкции ALTER TABLE с ограничением CHECK "тГрузы_Проверка даты". Конфликт произошел в базе данных "Аэропорт", таблица "dbo.тГрузы".
22 дек 12, 17:17    [13671060]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение на дату  [new]
aleks2
Guest
Ну, оно работает. Просто у тя в таблице есть записи не удовлетворяющие ограничению.
Либо

ALTER TABLE [dbo].[тГрузы]  WITH noCHECK ADD  CONSTRAINT [тГрузы_Проверка даты] CHECK  (dbo.CheckDATE(Дата_заказа, Рейс ) = 1)


Либо удаляй записи
select * from [dbo].[тГрузы]  where dbo.CheckDATE(Дата_заказа, Рейс ) = 0
22 дек 12, 17:39    [13671098]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение на дату  [new]
One_question
Member

Откуда: Украина, Донецк
Сообщений: 61
aleks2, Спасибо! После некоторых мельчайших корректировок CHECK прошел успешно!
Все работает.
Благодарю за потраченные нервы и извиняюсь что принесла неудобства своей недалекостью.
22 дек 12, 18:02    [13671146]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить