我创建了一个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
答案 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!] 将它切换到正确的数据库,它工作正常。
谢谢大家!