Stored procedures SQL Server 2017存储过程需要声明表变量,但它已存在
我已经有一段时间没有做过任何连续的T-SQL了。我认为我有这个权利,但我收到了一个错误,我无法找出原因。这适用于不复杂的存储过程。代码如下: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;
--======================================================
-- 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。应该可以了。谢谢尼尔斯。我知道这只是我的疏忽。谢谢你的解决办法。当你有一段时间没有使用它时,你会忘记所有的小事情。。。。