【发布时间】: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