【问题标题】:SQL Server 2017 Stored Procedure wants table variable declared but it already existsSQL Server 2017 存储过程需要声明表变量,但它已经存在
【发布时间】:2018-05-30 08:16:30
【问题描述】:

我已经有一段时间没有做任何严肃的 T-SQL 了。我以为我有这个权利,但我收到了一个我无法弄清楚原因的错误。这适用于不复杂的存储过程。代码如下:

--======================================================
-- Create Natively Compiled Stored Procedure Template
--======================================================

USE Viper;
GO

-- Drop stored procedure if it already exists
IF OBJECT_ID('API.newCategory','P') IS NOT NULL
   DROP PROCEDURE API.newCategory;
GO

CREATE PROCEDURE API.newCategory
    -- Add the parameters for the stored procedure here
    @Category varchar(20) = null 
WITH NATIVE_COMPILATION, SCHEMABINDING
AS BEGIN ATOMIC WITH
(
 TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english'
)
   --Insert statements for the stored procedure here
    DECLARE @tmp int = 0;

    IF @Category IS NOT NULL
    AND @Category != ''
        SET @tmp = ISNULL(
            (SELECT idCategory
            FROM Products.Category
            WHERE Category = @Category),0);

    IF @tmp = 0
        INSERT INTO Products.Category (Category)
        OUTPUT inserted.idCategory INTO @tmp
        VALUES (@Category);
    ELSE
        UPDATE Category
        SET active = 1
        WHERE idCategory = @tmp;

    RETURN @tmp;

END;
GO

我收到的错误信息是:

消息 1087,级别 16,状态 1,过程 newCategory,第 22 行 [批处理 开始第 11 行] 必须声明表变量“@tmp”。

我希望有人能指出我正确的方向。我确信这是非常简单的事情,我现在看不到它。恐怕有点生锈了。

需要明确的是,SP 的运营目标是: 1/ 检查是否确实有一个可供使用的类别 2/如果有则尝试获取其主键ID(idCategory) 3/ 如果类别没有 PK,则将其插入并将 idCategory 返回到 @tmp 4/ 如果有 PK 则确保活动列设置为 1 5/ 返回@tmp 作为结果(PK 或 0)

干杯,感谢您的帮助

青蛙

【问题讨论】:

    标签: stored-procedures sql-server-2017


    【解决方案1】:

    您的问题出在以下语句中:

    IF @tmp = 0
        INSERT INTO Products.Category (Category)
        OUTPUT inserted.idCategory INTO @tmp
        VALUES (@Category);
    

    您正在执行OUTPUTINTO,其中您将输出到之前声明的@tmp 中,该@tmp 被声明为intOUTPUT 语句只能针对表、临时表或表变量。

    一种解决方法是在该变量中声明一个表变量@catTabDECLARE @catTab AS TABLE(CatID int)OUTPUT,后跟一个:SELECT @tmp = CatID FROM @catTab。应该这样做。

    【讨论】:

    • 谢谢尼尔斯。我知道这将是我的一个简单的疏忽。感谢您的解决方法。这些都是你一段时间没用的时候忘记的小事......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 2020-01-05
    • 1970-01-01
    相关资源
    最近更新 更多