-1

列が更新されているかどうかを確認する UPDATE() で変数を使用することは可能ですか?

ここに私のサンプルコードがあります:

DECLARE @ColumnCount int
DECLARE @ColumnCounter int
DECLARE @ColumnName nvarchar(MAX)

SET @ColumnCounter = 0

SELECT @ColumnCount =  COUNT(c.COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS c  WHERE c.TABLE_NAME = 'Province'
    WHILE @ColumnCount >= @ColumnCounter
    BEGIN
       SELECT @ColumnName = c.COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS c  WHERE c.TABLE_NAME = 'Province' AND c.ORDINAL_POSITION = @ColumnCounter
        IF (UPDATE(@ColumnName))
       SET @ColumnCounter = @ColumnCounter + 1
    END
4

2 に答える 2

5

更新後トリガーで列が実際に更新されているかどうかを確認するには、トリガーコードが更新テーブルの行の古いバージョンと新しいバージョンを見つけることができる特別なテーブルmsdndeletedを使用できますinserted

各テーブルに複数の行がある可能性があることに注意してください。たとえば、update table1 set col1 = value1 where some_conditionによって影響を受けるトリガー数の行で実行すると、およびテーブルsome_conditionに表示されますinserteddeleted

いくつかの列が実際に更新されている行のトリガーを見つけるには、いくつかの主キーで挿入および削除されたテーブルを結合し、この列の値を比較できます

関数は、update()値として名前を持つ文字列変数ではなく、列名をパラメーターとして受け取ります

たとえばupdate()、トリガー チェックで使用すると、列の値が変更されていなくても、更新ステートメント に存在する場合 update(some_column)は true になります。some_columnset

更新された列の数をカウントするユニバーサルトリガーを作成できないようです。そのカウントが必要な場合は、このようなものを使用して各テーブルのトリガーを手動で作成する必要があります

declare @count int = 0
if update(col1) set @count = @count + 1
if update(col2) set @count = @count + 1
...
于 2013-02-28T10:11:19.410 に答える
1

いくつかのこと: 最初のループでは名前が変更されていないため、最初のループで処理する必要がある場合があります。以下のクエリは常に値を返す必要がありますが、@ColumnName が null の場合は、クエリが行を返さなかったことを意味するため、処理したい場合があります。

DECLARE @ColumnCount INT 
DECLARE @ColumnCounter INT 
DECLARE @ColumnName NVARCHAR(max) 
DECLARE @temp varchar(max)

SET @ColumnCounter = 0 

SELECT @ColumnCount = Count(c.column_name) 
FROM   information_schema.columns c 
WHERE  c.table_name = 'Province' 

WHILE @ColumnCount >= @ColumnCounter 
  BEGIN 
      SET @ColumnName = NULL 

      SELECT @ColumnName = c.column_name 
      FROM   information_schema.columns c 
      WHERE  c.table_name = 'Province' 
             AND c.ordinal_position = @ColumnCounter 

      IF ( @ColumnName != @temp ) 
        BEGIN 
        --do something 
        END
      SET @temp = @ColumnName
      SET @ColumnCounter = @ColumnCounter + 1 
  END 
于 2013-02-28T04:20:47.033 に答える