【问题标题】:SQL Error: "Must declare the scalar variable" when passing a table parameter to a table-valued functionSQL 错误:将表参数传递给表值函数时“必须声明标量变量”
【发布时间】: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


【解决方案1】:

让我告诉你表类型参数就像一个数据表。

所以,如果你想在上面加上 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;

【讨论】:

  • 这几乎就是我解决此问题的方法,尽管我更希望能够传递 NULL。顺便说一句,我认为 IF EXISTS ( SELECT * FROM @ids ) 可能比确定行数并将其与 0 进行比较更有效。
【解决方案2】:

只需检查您的表中是否有任何记录

if(select count(1) from @ids)>0

【讨论】:

    猜你喜欢
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 2023-03-16
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    相关资源
    最近更新 更多