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

下面的简单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
返回的错误为:

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进行比较更有效。