Stored procedures SQL Server 2017存储过程需要声明表变量,但它已存在

Stored procedures SQL Server 2017存储过程需要声明表变量,但它已存在,stored-procedures,sql-server-2017,Stored Procedures,Sql Server 2017,我已经有一段时间没有做过任何连续的T-SQL了。我认为我有这个权利,但我收到了一个错误,我无法找出原因。这适用于不复杂的存储过程。代码如下: --====================================================== -- Create Natively Compiled Stored Procedure Template --====================================================== USE Viper;

我已经有一段时间没有做过任何连续的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
我收到的错误消息是:

Msg 1087,16级,状态1,程序新类别,第22行[批次] 起始行11] 必须声明表变量“@tmp”

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

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

干杯,谢谢你的帮助


青蛙你的问题就在这句话里:

IF @tmp = 0
    INSERT INTO Products.Category (Category)
    OUTPUT inserted.idCategory INTO @tmp
    VALUES (@Category);
您正在执行一个
输出
中,您将输出到先前声明为
int
@tmp
中<代码>输出语句只能针对表、临时表或表变量


一种解决方法是声明一个表变量
@catTab
将@catTab声明为表(CatID int)
输出到该变量中,然后从@catTab
选择@tmp=CatID。应该可以了。

谢谢尼尔斯。我知道这只是我的疏忽。谢谢你的解决办法。当你有一段时间没有使用它时,你会忘记所有的小事情。。。。