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!]. Переключил ее на правильную базу данных, и она отлично работает.

Всем спасибо!

Другие вопросы по тегам