SQL "не может найти функцию или агрегат" скалярной функции
Я создал функцию sql, чтобы убедиться, что год является допустимым числом. Сейчас я создаю функцию, чтобы убедиться, что param1 не равен NULL, param2 также должен быть не NULL.
По какой-то причине dbo.fun_chk_year прекрасно работает, но dbo.fun_chk_req выдает:
Не удается найти ни столбец 'dbo', ни пользовательскую функцию, ни агрегат 'dbo.fun_chk_req', либо имя неоднозначно
----EDITED-----
Извините, ребята, я попытался пропустить часть кода, который казался неуместным для проблемы, и внес изменения, которые не должны были вноситься в попытке упростить вопрос. Вот лучшее объяснение:
Это запускается первым (это в отдельном документе запроса). Казалось бы, он выполняется без проблем.
CREATE FUNCTION dbo.fun_chk_year (@year smallint)
RETURNS tinyint
AS
BEGIN
IF (@year>1000 AND @year<=9999)
return 1;
return 0;
END
GO
CREATE FUNCTION [dbo].[fun_chk_req](@v1 sql_variant,@v2 sql_variant)
RETURNS tinyint
AS
BEGIN
IF (@v1 IS NULL OR (@v2 IS NOT NULL AND @v1 IS NOT NULL))
return 1;
return 0;
END
GO
Это второй запуск. Вот где я получаю ошибку.
CREATE TABLE [dbo].[repair](
[ID] [int] IDENTITY(1,1) NOT NULL,
[year] [smallint] NULL
CONSTRAINT year_cnstr CHECK (dbo.fun_chk_year(year)=1),
[year_completed] [smallint] NULL
CONSTRAINT comp_cnstr CHECK (dbo.fun_chk_year(year_completed)=1),
CONSTRAINT yr_and_comp_cnstr CHECK ([dbo].[fun_chk_req](year_completed,year)=1),
PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
2 ответа
Сначала определите функцию (которую я изменил), а затем используйте ее в определении таблицы.
Кстати, вы используете функцию fun_chk_year, которую вы не предоставили в своем примере. Я надеюсь, что это существует в конце.
Кроме того, вы забыли закрыть последнюю скобку на вашем CREATE TABLE
,
Попробуйте это вместо этого:
/*Function*/
ALTER FUNCTION [dbo].[fun_chk_req](@v1 sql_variant,@v2 sql_variant)
RETURNS tinyint
AS
BEGIN
IF (@v1 IS NULL OR (@v2 IS NOT NULL AND @v1 IS NOT NULL))
return 1;
return 0;
END
GO
/*Table with function call*/
CREATE TABLE [dbo].[repair](
[ID] [int] IDENTITY(1,1) NOT NULL,
[year] [smallint] NULL
CONSTRAINT year_cnstr CHECK (dbo.fun_chk_year(year)=1),
[year_completed] [smallint] NULL
CONSTRAINT comp_cnstr CHECK (dbo.fun_chk_year(year_completed)=1),
CONSTRAINT yr_and_comp_cnstr CHECK ([dbo].[fun_chk_req](year_completed,year)=1)
)
Я попробовал это (используя фиктивную функцию для chk_year), и это сработало для меня.
Оказывается, я создавал функцию в базе данных master [DOH!]. Переключил ее на правильную базу данных, и она отлично работает.
Всем спасибо!