-4

トリガーがありますが、更新されたレコードの主キーを取得する必要があるため (データ SELECT @Id= @@IDENTITY を挿入するなど)、それを where 条件に渡すことができます。どうやってやるの?

ALTER TRIGGER [dbo].[CariBakiyeBorcAktar]
       ON  [dbo].[BakimKartiDegisenParcalar]
       AFTER   UPDATE
    AS 
    BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;

    DECLARE @Id int 
    DECLARE @CariId int 
    DECLARE @SId int 
    DECLARE @MId int
    declare @Tutar decimal
    declare @Bakiye decimal
    declare @s decimal = 0


    DECLARE @ParcaId int 


    --how I can I get the last updateed record Identity like this??
    --and pass it to update query as a where condition
    SELECT @Id= @@IDENTITY




    set @SId=(select SId from CariBakiye where Id =@Id)

    select @CariId=tblk.CariId ,@MId=tblk.MId, @SId= tblk.SId,@Tutar=tblk.Tutar from (
    SELECT tbl.CariId , tbl.MId,tbl.SId,tbl.Tutar from (select cb.MId,SUM(bk.Tutar) as  Tutar,bk.SId,cb.Id  as CariId FROM [BakimKartiDegisenParcalar] bk
    join  CariBakiye cb on cb.SId=bk.SId
     where bk.SId  =cb.SId group by bk.SId,cb.MId,cb.Id ) as tbl 
    ) as tblk  where SId = @SId

    set @Bakiye = @s-@Tutar


    update CariBakiye set Borc=@Tutar,Bakiye=@Bakiye where Id=@CariId

    print @Id
        -- Insert statements for trigger here

    END
4

1 に答える 1

0

Martin が言ったように、SQL Server のトリガーは行ごとではなくステートメントごとであることを理解する必要があります。したがって、トリガーのコンテキストでは、inserted と deletedの 2 つのテーブルがあり、更新されたデータに関するすべての情報を見つけることができます。本当に行ごとの処理を行いたい場合は、カーソルを使用できます。

ALTER TRIGGER [dbo].[CariBakiyeBorcAktar] ON  [dbo].[BakimKartiDegisenParcalar]
AFTER UPDATE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE @Id int 
    DECLARE @CariId int 
    DECLARE @SId int 
    DECLARE @MId int
    declare @Tutar decimal
    declare @Bakiye decimal
    declare @s decimal = 0

    DECLARE @ParcaId int 


    declare tr_cursor cursor local fast_forward for
        select ID from inserted

    while 1 = 1
    begin
        fetch tr_cursor into @Id
        if @@fetch_status <> 0 break

        set @SId=(select SId from CariBakiye where Id =@Id)

        select @CariId=tblk.CariId ,@MId=tblk.MId, @SId= tblk.SId,@Tutar=tblk.Tutar from (
        SELECT tbl.CariId , tbl.MId,tbl.SId,tbl.Tutar from (select cb.MId,SUM(bk.Tutar) as  Tutar,bk.SId,cb.Id  as CariId FROM [BakimKartiDegisenParcalar] bk
        join  CariBakiye cb on cb.SId=bk.SId
         where bk.SId  =cb.SId group by bk.SId,cb.MId,cb.Id ) as tbl 
        ) as tblk  where SId = @SId

        set @Bakiye = @s-@Tutar


        update CariBakiye set Borc=@Tutar,Bakiye=@Bakiye where Id=@CariId

        print @Id
            -- Insert statements for trigger here
    end
    close tr_cursor
    deallocate tr_cursor
END
于 2013-07-28T11:25:51.337 に答える