【发布时间】:2015-05-20 02:59:33
【问题描述】:
以下简单的 SQL 示例返回错误。
这是传递给表值函数的表类型:
CREATE TYPE Ids
AS TABLE
(
Id int NOT NULL,
PRIMARY KEY( Id )
);
GO
这是失败的表值函数:
CREATE FUNCTION GetIds
(
@ids -- or null
Ids READONLY
)
RETURNS
@result
TABLE
(
EachId int
)
AS
BEGIN
IF @ids IS NOT NULL
INSERT INTO @result
SELECT Id
FROM @ids;
RETURN;
END;
GO
返回的错误是:
消息 137,级别 16,状态 1,过程 GetIds,第 28 行
必须声明标量变量“@ids”。
我读过帖子说SQL兼容级别太旧时会发生这种情况,但以下返回100:
SELECT compatibility_level
FROM sys.databases
WHERE name = 'TheDatabaseName';
任何建议将不胜感激。
【问题讨论】:
-
该错误是因为您使用了未声明的变量。示例
declare @ids table(Ids int) -
S.Visser:它被声明为 Ids 类型。这就是您将表作为参数传递的方式。
-
它已创建,未声明。如果你引用它,你需要声明它。认为这将 msdn doc 将解释 msdn.microsoft.com/en-us/library/bb510489.aspx
-
我认为你错过了那个例子。请注意,@TVP 作为参数传递,并且没有“声明”。
-
奇怪的是,删除“IF @ids IS NOT NULL”行,错误就消失了。看来我需要检查一个空表。
标签: sql sql-server