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

从存储过程SQL中插入的操作更新、删除中设置值,sql,sql-server,stored-procedures,sql-update,sql-insert,Sql,Sql Server,Stored Procedures,Sql Update,Sql Insert,我已经创建了存储过程,但我不知道如何从表中设置一列 这与我的代码是分开的: 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 DELE

我已经创建了存储过程,但我不知道如何从表中设置一列

这与我的代码是分开的:

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\u operational
设置为1(如果存在来自另一个字段的新数据),2表示来自另一个字段的已存在更新数据,3表示存储过程中来自另一个字段的已删除数据

此代码的错误是:

无效的对象名称“已插入”


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

如果要在表中统计插入记录或删除记录的数量,有两种方法,最简单的方法是:


创建如下所示的存储过程:

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
类似的问题也适用于更多其他方式,如临时表或…

此外,下面的链接是一个问题,询问如何为delete和insert定义触发器,以便您可以同时使用已删除/插入的表


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



插入的
表和删除的
表从何而来?它们通常用于触发器,但不会自动存在于SPs中。@DaleK我应该创建tabel inserted和delete table吗?@aldonnihut存储过程既没有insert计数,也没有delete计数,您实际上是在尝试创建触发器吗?我建议添加一些示例数据,以及您的预期结果,以尝试澄清您试图实现的目标。@DaleK是的,我想在我的存储过程中创建触发器。旁注:您不应该在存储过程中使用
sp
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀!谢谢你的回答,但我不知道如何创建触发器。请帮忙me@aldonnihut我应该在存储过程中还是在存储外创建触发器,请使用此链接procedure@aldonnihut给你。可能有帮助you@MartinSmith问题标签是mysql,然后已编辑到sqlserver!我甚至搜索将我的语法从sqlserver更改为mysql:)
    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