Переключить CASE в хранимой процедуре в SQL - PullRequest
0 голосов
/ 09 мая 2019

получение ошибки в случае коммутатора

SELECT CASE @PurchaseId
      WHEN 1 THEN INSERT into tblPurchaseInMstr(DocNo,DocType,DocDate,PurchaseDate,SalesNodeId,SalesNodeType,FYID,LoginIDIns, TimestampIns,StatusId,InvTotPurchValue,InvTotPurchWDisc,InvNetAmt,DocSourceNodeId,DocSourceNodeType,InvTotalCGSTAmt,InvTotalSGSTAmt,InvTotalIGSTAmt)
 values(@DocNo,@DocType,@DocDate,@PurchaseDate,@SalesNodeId,@SalesNodeType,@FYID,@LoginID, GETDATE(),@StatusId,@InvTotPurchValue,@InvTotPurchWDisc,@InvNetAmt,@DocSourceNodeId,@DocSourceNodeType,@InvTotalCGSTAmt,@InvTotalSGSTAmt,@InvTotalIGSTAmt)

WHEN @PurchaseId 2 THEN UPDATE tblPurchaseInMstr set DocNo=@DocNo DocType=@DocType,DocDate=@DocDate,PurchaseDate=@PurchaseDate,SalesNodeId=@SalesNodeId,SalesNodeType=@SalesNodeType,FYID=@FYID,LoginIDUpd=@LoginId,TimestampUpd=GETDATE(),StatusId=@StatusId,InvTotPurchValue=@InvTotPurchValue,InvTotPurchWDisc=@InvTotPurchWDisc,InvNetAmt=@InvNetAmt,DocSourceNodeId=@DocSourceNodeId,DocSourceNodeType=@DocSourceNodeType,InvTotalCGSTAmt=@InvTotalCGSTAmt,InvTotalSGSTAmt=@InvTotalSGSTAmt,InvTotalIGSTAmt=@InvTotalIGSTAmt where PurchaseId=@PurchaseId

 WHEN 3 THEN DELETE tblPurchaseInMstr

 END AS Purchaseid  from tblPurchaseInMstr

END

GO

Ответы [ 2 ]

3 голосов
/ 09 мая 2019

Вы не можете выполнять запросы в выражении CASE.Выражение case ... ну ... просто выражение, которое должно давать значение.

Если вы хотите выполнять операторы на основе значения переменной / параметра, используйте блоки IF

ИЯ предполагаю, что вы не хотите удалять всю таблицу в случае значения 3 ...;)

Редактировать:

Я только добавил комментарий с вопросомв исходном сообщении (относительно @PurchaseId, действующего как логическая переменная выполнения и переменная идентификатора записи / ключа).

Я обновил первый IF-блок для извлечения вставленного значения идентификатора в @PurchaseId, предполагая,tblPurchaseInMstr.PurchaseId - это столбец идентификаторов.

И я ввел переменную / параметр @Action, представляющий действие, которое необходимо выполнить: 1 = вставить, 2 = обновить, 3 = удалить.

IF @Action = 1 BEGIN
    INSERT INTO tblPurchaseInMstr
    (
        DocNo,DocType,DocDate,PurchaseDate,SalesNodeId,SalesNodeType,FYID,LoginIDIns,
        TimestampIns,StatusId,InvTotPurchValue,InvTotPurchWDisc,InvNetAmt,DocSourceNodeId,
        DocSourceNodeType,InvTotalCGSTAmt,InvTotalSGSTAmt,InvTotalIGSTAmt
    )
    VALUES
    (
        @DocNo,@DocType,@DocDate,@PurchaseDate,@SalesNodeId,@SalesNodeType,@FYID,@LoginID,
        GETDATE(),@StatusId,@InvTotPurchValue,@InvTotPurchWDisc,@InvNetAmt,@DocSourceNodeId,
        @DocSourceNodeType,@InvTotalCGSTAmt,@InvTotalSGSTAmt,@InvTotalIGSTAmt
    );

    SET @PurchaseId = SCOPE_IDENTITY();
END;

IF @Action = 2 BEGIN
    UPDATE tblPurchaseInMstr
    SET
        DocNo=@DocNo, DocType=@DocType,DocDate=@DocDate,PurchaseDate=@PurchaseDate,SalesNodeId=@SalesNodeId,SalesNodeType=@SalesNodeType,FYID=@FYID,LoginIDUpd=@LoginId,
        TimestampUpd=GETDATE(),StatusId=@StatusId,InvTotPurchValue=@InvTotPurchValue,InvTotPurchWDisc=@InvTotPurchWDisc,InvNetAmt=@InvNetAmt,DocSourceNodeId=@DocSourceNodeId,
        DocSourceNodeType=@DocSourceNodeType,InvTotalCGSTAmt=@InvTotalCGSTAmt,InvTotalSGSTAmt=@InvTotalSGSTAmt,InvTotalIGSTAmt=@InvTotalIGSTAmt
    WHERE PurchaseId = @PurchaseId;
END;

IF @Action = 3 BEGIN
    DELETE FROM tblPurchaseInMstr
    WHERE PurchaseId = @PurchaseId;
END;

SELECT @PurchaseId AS PurchaseId;
0 голосов
/ 09 мая 2019

CASE в sql server - это функция.Возвращает данные на основе других данных.Он не принимает операторы, он не контролирует поток программ.

В sql-сервере нет switch.Вы можете использовать только IF:

If @PurchaseId=1 insert into tblPurchaseInMstr(...
If @PurchaseId=2 UPDATE tblPurchaseInMstr...

и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...