0

テーブルのフィールドを繰り返し処理し、その値がデフォルト値と等しくない場合は何かをする必要があります。

私はトリガーにいるので、テーブル名を知っています。次に、このループを使用して各フィールドをループします。

select @field = 0, @maxfield = max(ORDINAL_POSITION) from
INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @TableName

while @field < @maxfield
begin
...

次に、ループを介して各反復でフィールド名を取得できます。

select @fieldname = COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = @TableName
and ORDINAL_POSITION = @field

そして、その列のデフォルト値を取得できます。

select @ColDefault = SUBSTRING(Column_Default,2,LEN(Column_Default)-2)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE Table_Name = @TableName
AND Column_name = @fieldname

必要なものはすべて揃っていますが、2 を比較する方法がわかりません。フィールド名を定数として持っていないため、変数内にのみあるため、' から値を取得する方法がわかりません。挿入されたテーブル(トリガーにいることを思い出してください)がデフォルト値と同じかどうかを確認します(現在、@ColDefaultにvarcharとして保持されています)。

4

2 に答える 2

2

まず、複数のレコードが同時に入ってくるとトリガーが起動される可能性があることを覚えておいてください。私がこれを行う場合:

INSERT INTO dbo.MyTableWithTrigger
  SELECT * FROM dbo.MyOtherTable

MyTableWithTrigger のトリガーは、複数のレコードを処理する必要があります。「挿入された」疑似テーブルには、複数のレコードが含まれます。

そうは言っても、データを比較するには、次のような select ステートメントを実行できます。

DECLARE @sqlToExec VARCHAR(8000)
SET @sqlToExec = 'SELECT * FROM INSERTED WHERE [' + @fieldname + '] <> ' + @ColDefault
EXEC(sqlToExec)

これにより、挿入された疑似テーブルからデフォルトに一致しないすべての行が返されます。これらの行で何かをしたいように聞こえるので、その @sqlToExec 文字列を呼び出す前に一時テーブルを作成し、データを選択するだけでなく、それを一時テーブルに挿入することをお勧めします。次に、これらの行を使用して、必要な例外処理を行うことができます。

1 つのキャッチ - この T-SQL は数値フィールドに対してのみ機能します。おそらく、さまざまなタイプのフィールドに対して個別の処理を構築したいと思うでしょう。varchar、numeric、blob などがある場合は、それらを比較するさまざまな方法が必要になります。

于 2009-01-20T11:50:37.593 に答える
2

and exec を使用してこれを行うことができると思います。

しかし、コードを一度だけ生成しないのはなぜですか。より高性能になります

于 2011-01-17T15:32:45.517 に答える