SQL错误:";必须声明标量变量";将表参数传递给表值函数时
下面的简单SQL示例返回一个错误 以下是传递给表值函数的表类型:SQL错误:";必须声明标量变量";将表参数传递给表值函数时,sql,sql-server,Sql,Sql Server,下面的简单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
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
返回的错误为:
Msg 137,16级,状态1,程序GetIds,第28行必须声明标量变量“@ids” 我读过一些帖子,上面说当SQL兼容级别太旧时会发生这种情况,但下面返回100:
SELECT compatibility_level
FROM sys.databases
WHERE name = 'TheDatabaseName';
如果您有任何建议,我们将不胜感激。让我告诉您,表类型参数就像一个数据表 所以,如果你想给它加上if条件 只需按以下方式更改功能的if条件:
IF (select count(*) from @ids) > 0
完整的功能代码为:
CREATE FUNCTION GetIds
(
@ids Ids READONLY
)
RETURNS @result TABLE(EachId int)
AS
BEGIN
IF (select count(*) from @ids) > 0
INSERT INTO @result
SELECT Id FROM @ids;
RETURN;
END;
只需检查一下表中是否有任何记录
if(select count(1) from @ids)>0
错误是因为您使用了未声明的变量。示例
declare@ids table(ids int)
S.Visser:它被声明为ids类型。这是作为参数传递表的方式。表是创建的,而不是声明的。如果你提到它,你需要申报。我想这会让msdn文档解释我想你错过了阅读这个例子。请注意,@TVP作为参数传递,没有“声明”的地方。奇怪的是,删除了“IF@ids NOT NULL”行,错误就消失了。似乎我需要检查一个空表,这几乎就是我解决这个问题的方法,尽管我更希望能够传递NULL。顺便说一句,我认为IF EXISTS(从@ids中选择*)可能比确定行数并将其与0进行比较更有效。