从操作更新、删除、插入到存储过程 SQL 中设置值

Posted

技术标签:

【中文标题】从操作更新、删除、插入到存储过程 SQL 中设置值【英文标题】:Set Value From Action Update, Delete, Inserted in Stored Procedure SQL 【发布时间】:2020-01-13 07:08:02 【问题描述】:

我已经创建了我的存储过程,但是我很困惑如何从我的表中设置一列。

这与我的代码是分开的:

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 表示来自存储过程中另一个字段的已删除数据。

此代码的错误是:

无效的对象名称“插入”

【问题讨论】:

INSERTEDDELETED 来自哪里?它们通常用于触发器,但不会自动存在于 SP 中。 @DaleK 我应该创建插入表和删除表吗? @aldonnihut 存储过程既没有插入计数也没有删除计数,您实际上是在尝试创建触发器吗?我建议添加一些示例数据和您的预期结果,以尝试阐明您要完成的工作。 @DaleK 是的,我想在我的存储过程中创建触发器。 旁注:您应该为您的存储过程使用sp_ 前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_ 并使用其他东西作为前缀 - 或者根本没有前缀! 【参考方案1】:

错误显示的问题是您不能在存储过程中使用已删除/插入的表,而只能在触发器中访问

如果您想计算表中插入记录或删除记录的数量,有两种方法可以做到这一点,最简单的一种是:


像这样创建你的存储过程:

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)  

在触发器中调用您的存储过程并将@insCount 和@delCount 作为输入传递

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

类似的问题是更多其他方式,如临时表或...How use inserted\deleted table in stored procedure?

下面的链接也是一个问题,要求为删除和插入定义触发器,以便您可以同时使用已删除/插入的表SQL Trigger on Update, Insert, Delete on non-specific row, column, or table


当您经常执行所有这些过程时,第二种更好的方法是获取插入、更新或删除的日志,这样您就不会使用会降低过程性能的触发器。 (如果有用我可以推荐一些保存表日志的想法)


    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

【讨论】:

感谢您的回答,但我不知道如何创建触发器。请帮助我 @aldonnihut 使用此链接mysqltutorial.org/create-the-first-trigger-in-mysql.aspx 我应该在存储过程中创建触发器还是在存储过程中创建触发器 @aldonnihut 在这里。可以帮助你 @MartinSmith 问题标签是 mysql 然后已被编辑到 sqlserver!我什至搜索将我的语法从 sqlserver 更改为 mysql :)

以上是关于从操作更新、删除、插入到存储过程 SQL 中设置值的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework 6 Recipes 2nd Edition(10-10)译 - > 为TPH继承的插入更新删除操作映射到存储过程

在 SQL 中插入一行并在存储过程中设置变量?

MS SQL 批量更新\插入

使用存储过程将数据从 SQL 表插入 Excel

在存储过程调用期间,您何时可以看到更新、插入和删除的效果?

如何使用 VBA 执行插入/更新记录的存储过程?