2

私は SQL Server とトリガーを初めて使用します。新しい行が挿入されたとき、または既存の行が更新されたときに起動するトリガーを作成したいと考えています。トリガーは、一連の計算列を更新します。

誰かfldType = 'INVALID'が、別の列errInvalidをに設定するかどうかをチェックする基本的なトリガーを教えてください1

1 日あたり (1 回のヒットで) 5000 行が挿入されるため、パフォーマンスが問題になることに注意してください。私は他の場所を見ましたが、混乱しています。

OK、私の質問は発展しました。Persisted Columns ルートを下って行きました。成功した基本的な永続フィールドを作成しましたが、ネストされたロジック pf に問題があります。

次のことを行うことができますか (およびその方法):

case [MissCustName] が true の場合 then [CustomerAccountName] が NULL の場合 then (1) else (0) end else (0) end

4

5 に答える 5

3

おそらく、代わりに計算列を使用する方がよいでしょう。

create table myTab
(
    fieldType varchar(10),
    errInvalid As Case When fieldType = 'INVALID' then 1 else 0 end PERSISTED
)
Go
insert into mytab(fieldType) values ('aaa')
insert into mytab(fieldType) values ('INVALID')
Go
Select * from mytab
于 2012-06-12T15:51:10.537 に答える
1

計算列が本当に必要です。パフォーマンスが向上します。このSO投稿を参照してください。

CREATE TABLE [dbo].[myTab]
(
  [fldType] [varchar](50) NULL ,
  [errInvalid] AS ( CASE [fldType]
                      WHEN 'Invalid' THEN ( 1 )
                      ELSE ( 0 )
                    END )
) 
于 2012-06-12T15:52:55.013 に答える
1

「実際の」計算列を使用しないのはなぜですか?

例えば:

CREATE TABLE foobar
(
    fldType varchar(10),
    errInvalid AS CASE WHEN fldType = 'INVALID' THEN 1 ELSE 0 END
)

永続化された計算列を使用すると、多くの読み取りを行う場合におそらくパフォーマンスが向上します (「物理」列のレベルまで)。PERSISTED列定義の後に追加するだけです:

CREATE TABLE foobar
(
    fldType varchar(10),
    errInvalid AS CASE WHEN fldType = 'INVALID' THEN 1 ELSE 0 END PERSISTED
)
于 2012-06-12T15:54:17.447 に答える
1

これに沿って何かを使用できます:

CREATE TRIGGER dbo.trgInsertUpdate
ON dbo.YourTableNameHere
FOR INSERT, UPDATE 
AS BEGIN
   -- update the column
   UPDATE dbo.YourTableNameHere
   SET errInvalid = 1
   FROM Inserted i 
   WHERE 
      dbo.YourTableNameHere.ID = i.ID   -- establish link to "Inserted" pseudo-table
      AND fldType = 'INVALID'
END

基本的に、トリガーはステートメントごとに 1 回呼び出されるため、一度に複数の行に適用される場合がありますこれらの行とその新しい値は、Insertedテーブルのすべての列を含む疑似テーブルに格納されます。

fldType = 'INVALID'疑似テーブルの一部でもあるInserted(挿入または更新された)テーブルで、 、 、および の行を見つける必要があります。

于 2012-06-12T15:45:55.303 に答える
1

私はこれがあなたが望むことをすると思います:

CREATE TRIGGER Trigger1
ON Table1
FOR INSERT, UPDATE
AS
    UPDATE t
    SET    errInvalid = 1
    FROM   Table1 t
           INNER JOIN Inserted i
             ON i.id = t.id
    WHERE  t.fldType = 'INVALID'
于 2012-06-12T15:46:17.187 に答える