Sql-Server

如何使用觸發器中同一新插入行的值更新列?

  • May 8, 2020

使用 SQL Server 2014,我有這個:

Table1
Tab1_id        int identity(1,1) primary key
Tab1_val1      smallint
Tab1_val2      smallint
Tab1_valInfo   varchar(10) -- not yet implemented, will be used only for presentation
Tab1_id |   Tab1_val1 |   Tab1_val2 | Tab1_valInfo
---------|-------------|-------------|--------------
      1 |          25 |          19 | 0025-0019
      2 |           0 |           5 | 0000-0005
      3 |          12 |           3 | 0012-0003

現在有了我相當短的 SQL 經驗,我正在嘗試的是:

從插入數據所需的唯一輸入值的應用程序中Tab1_val1Tab1_val2然後,創建一個更新Tab1_valInfo列的觸發器。

create trigger utr_ValInfo on Table1
after insert as
begin

   declare @size int = 4;

   declare @valInfo varchar(10) =
       select right('0000' + convert(varchar, /* insertedRow.Tab1_val1 */), @size) from inserted
       + '-' +
       select right('0000' + convert(varchar, /* insertedRow.Tab1_val2 */), @size) from inserted;

   update Table1 set Tab1_valInfo = @valInfo where /* this is the last inserted row*/;

end;

單個插入可能涉及多行。

我希望我想要達到的目標是明確的。

您可以嘗試計算列而不是觸發器,因為它易於修改。試試下面的查詢

create table tab_computed 
(
Tab1_id        int identity(1,1) primary key,

Tab1_val1      smallint,

Tab1_val2      smallint,

Tab1_valInfo   as (right('0000' + convert(varchar,Tab1_val1), 4)+ '-' + right('0000' + convert(varchar,Tab1_val2), 4)) 
) 

insert into tab_computed 
(Tab1_val1,Tab1_val2) values (25,19),(0,5),(12,3)

select * from tab_computed

結果集:

在此處輸入圖像描述

嘗試這個

create trigger utr_ValInfo on Table1
after insert as
begin

   declare @size int = 4;

   UPDATE Table1 

   SET 
        Tab1_valInfo  = right('0000' + convert(varchar, i.Tab1_val1), @size) 
           + '-' +
            right('0000' + convert(varchar, i.Tab1_val2), @size)

   FROM Inserted i

   WHERE 
        Table1.Tab1_id= i.Tab1_id;
end;

並且不要在沒有長度的轉換中聲明 varchar

引用自:https://dba.stackexchange.com/questions/83234