SQL“无法找到标量函数的函数或聚合”

时间:2015-07-02 13:06:19

标签: sql sql-server function check-constraints

我创建了一个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 个答案:

答案 0 :(得分: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的虚函数),它对我有用。

答案 1 :(得分:0)

原来我在master数据库中创建了这个函数[DOH!] 将它切换到正确的数据库,它工作正常。

谢谢大家!