Установить значение из действия Обновление, Удалить, Вставлено в хранимую процедуру SQL - PullRequest
0 голосов
/ 13 января 2020

Я создал свою хранимую процедуру, но я не уверен, как установить один столбец из моей таблицы.

Это отдельный код:

CREATE PROC [dbo].[SP_Gabungan]
    @REPORT_DT DATE
AS
BEGIN
    DECLARE @action NVARCHAR(10),
            @insCount INT = (SELECT COUNT (*) FROM INSERTED),
            @delCount INT = (SELECT COUNT (*) FROM DELETED)

    SELECT
        @REPORT_DT AS REPORT_DATE,
        FD.BRANCH_CODE AS [BRANCH],
        @action AS [ID_OPERATIONAL],   -- I want to set this value as 1(if there is a new input data, 2 
                                       -- (if there is updated data), 3 (if there is deleted data) from 
                                       -- from another field
        BR.REGULATOR_BRANCH as [RG_BRANCH]
    FROM 
        [DBO].[F_RR_FUNN] FD
    LEFT JOIN 
        [DBO].[MS_BRANCH] BR ON BR.BRANCH_CD = FD.BRANCH_CODE
    WHERE 
        FD.GROUP_PRODUCT = 'CA'
        AND Y17sa = '1'
        AND FD.REPORT_DATE = @REPORT_DT
END

Как мне установить столбец ID_OPERASIONAL как 1 (если есть новые данные из другого поля), 2 для существующих обновленных данных из другого поля, 3 для удаленных данных из другого поля в хранимой процедуре.

ОШИБКА из этого кода равна :

Неверное имя объекта 'INSERTED'

1 Ответ

1 голос
/ 13 января 2020

Проблема, которую показывает ОШИБКА, заключается в том, что вы не можете использовать удаленные / вставленные таблицы в хранимых процедурах, а просто доступны в триггерах .

Если вы хотите иметь количество вставленных записей или удаленных У записей в таблице есть два способа сделать это, самый простой из которых:


Создать хранимую процедуру следующим образом:

CREATE PROC [dbo].[SP_Gabungan]
@REPORT_DT DATE,@DeletedCount INT , @InsertedCount Int
AS
BEGIN
...

Создать триггер после вставки и удаления ( так что вы можете вставить / удалить таблицы)
Затем получите счетчик, как вы делали это в своем коде:

DECLARE @action nvarchar (10),
        @insCount int = (SELECT COUNT (*) FROM INSERTED),
        @delCount int = (SELECT COUNT (*) FROM DELETED)  

Вызовите свою хранимую процедуру в Trigger и передайте @insCount и @delCount в качестве входных данных

EXEC [dbo].[SP_Gabungan]
@REPORT_DT = GETDATE() , @InsertedCount = @insCount , @DeletedCount = @delCount

Похожий вопрос для других способов, таких как временные таблицы или ...
Как использовать вставленную \ удаленную таблицу в хранимой процедуре?

Также по ссылке ниже задается вопрос об определении триггера для удаления и вставки, чтобы вы могли использовать обе удаленные / вставленные таблицы вместе
SQL Триггер при обновлении, вставке, удалении при отсутствии спецификации ifi c строка, столбец или таблица


Второй способ, который лучше всего выполнять, когда вы выполняете все эти процессы, состоит в том, чтобы получить журнал ваших вставок, обновлений или удалений. вы не используете триггеры, которые снижают производительность вашего процесса.
(Если это полезно, я могу порекомендовать некоторые идеи для сохранения журналов таблиц)


    CREATE PROC [dbo].[SP_Gabungan]
        @REPORT_DT DATE
       ,@DeletedCount INT 
       ,@InsertedCount INT
       ,@UpdateCount INT
AS BEGIN


 DECLARE @action INT

        SET @action = CASE
                        WHEN @InsertCount <> 0 THEN 1
                        WHEN @UpdateCount <> 0 THEN 2
                        WHEN @DeletedCount <> 0 THEN 3
                     END

        SELECT
            @REPORT_DT AS REPORT_DATE,
            FD.BRANCH_CODE AS [BRANCH],
            @action AS [ID_OPERATIONAL],
            BR.REGULATOR_BRANCH as [RG_BRANCH]
        FROM 
            [DBO].[F_RR_FUNN] FD
        LEFT JOIN 
            [DBO].[MS_BRANCH] BR ON BR.BRANCH_CD = FD.BRANCH_CODE
        WHERE 
            FD.GROUP_PRODUCT = 'CA'
            AND Y17sa = '1'
            AND FD.REPORT_DATE = @REPORT_DT END

   CREATE TRIGGER [YourTriggerName]
   AFTER INSERT/UPDATE/DELETE ON [db].[tablename]
     FOR EACH ROW
     BEGIN
            DECLARE 
            @insCount int = (SELECT COUNT (*) FROM New), -- New in MySQL is same as inserted,deleted,updated
            @delCount int = (SELECT COUNT (*) FROM Old),
            @upCount int =  (SELECT COUNT (*) FROM New),

           EXEC [dbo].[SP_Gabungan]
            @REPORT_DT = GETDATE()
           ,@DeletedCount = @delCount
           ,@InsertedCount = @insCount
           ,@UpdateCount = @upCount
     END
...