SQL Server 2017存储过程希望声明表变量但它已经存在

时间:2018-05-30 08:16:30

标签: stored-procedures sql-server-2017

因为我做了任何琐碎的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,Level 16,State 1,Procedure newCategory,Line 22 [Batch   第11行]       必须声明表变量“@tmp”。

我希望有人能指出我正确的方向。我确信这是一件非常简单的事情,我现在无法看到它。我害怕有点生疏。

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

干杯并感谢您的帮助

青蛙

1 个答案:

答案 0 :(得分:2)

您的问题出在本声明中:

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

您正在执行OUTPUT INTO,其中您输出的内容已声明为@tmp int,并声明为OUTPUT@catTab语句只能对表,临时表或表变量。

解决方法可能是将表变量DECLARE @catTab AS TABLE(CatID int)OUTPUTSELECT @tmp = CatID FROM @catTab声明到该变量后跟一个:SXSSFSheet sheet = workbook.getSheetAt(0); 。应该这样做。