因为我做了任何琐碎的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)
干杯并感谢您的帮助
青蛙
答案 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)
:OUTPUT
和SELECT @tmp = CatID FROM @catTab
声明到该变量后跟一个:SXSSFSheet sheet = workbook.getSheetAt(0);
。应该这样做。