Хранимая процедура 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

Сообщение об ошибке, которое я получаю:

Сообщение 1087, уровень 16, состояние 1, процедура newCategory, строка 22 [строка запуска пакета 11] Необходимо объявить табличную переменную «@tmp».

Я надеюсь, что кто-то может указать мне в правильном направлении. Я уверен, что это что-то до глупости простое, я просто не могу видеть это прямо сейчас. Боюсь, немного ржавый.

Просто для ясности, операционная цель SP состоит в том, чтобы: 1/Проверить, действительно ли существует Категория, предоставленная для работы 2/Если есть, то попытаться получить ее идентификатор первичного ключа (idCategory) 3/Если нет PK для категории, затем вставьте его и верните idCategory в @tmp 4/ Если есть PK, убедитесь, что для активного столбца установлено значение 1 5/ верните @tmp в качестве результата (либо PK, либо 0)

Ура и спасибо за любую помощь

Лягушка


person The Frog    schedule 30.05.2018    source источник


Ответы (1)


Ваша проблема в этом утверждении:

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. Это должно сработать.

person Niels Berglund    schedule 30.05.2018
comment
Спасибо, Нильс. Я знал, что это будет простой оплошностью с моей стороны. Спасибо за обходной путь. Это все мелочи, которые вы забываете, когда не используете их какое-то время.... - person The Frog; 31.05.2018