2016-11-07 11 views
-2

SQL Server INSTEAD OF INSERTがテーブルに値を入力するトリガを取得しました。私は、INSERT文を実行したときしかし、私はSQL Serverトリガ:無効なオブジェクト名が大文字と小文字の区別データベースに挿入されました

無効なオブジェクト名は、「挿入」というエラーが出る

今私のデータベースの照合順序は、大文字と小文字を区別するように設定されているので、私はかどうかわからないんだけど「挿入された」ケースが原因ですが、挿入、挿入、挿入が試行されました。

マイトリガー見て何かのように:

CREATE TRIGGER UpdateID 
ON Personnel 
INSTEAD OF INSERT 
AS 
BEGIN 
    DECLARE @SQL nvarchar(4000)  
    DECLARE @NewID int = 100 --Will be auto generated 

    SET @SQL = 'INSERT INTO Personnel (AutoID, Firstname, Surname) 
       SELECT ' + CAST(@NewID AS nvarchar) + ', Firstname, Surname 
       FROM inserted' 
    EXECUTE (@SQL) 
END 
+7

なぜ動的SQLを使用しますか?ここでは不要と思われます。 –

+1

不必要であるだけでなく、エラーの原因... – petelids

+1

なぜ同じテーブルのトリガの 'Personnel'テーブルにレコードを挿入していますか?再帰が作成されます。 – Shell

答えて

4

動的SQLは、呼び出し元のコードブロック内の変数とテーブルが使用できない可能性があり、新たな「文脈」を作成します。

insertedが利用できないことはまったく驚くことではありません。簡単な解決策は、動的SQLを使用するのではありません。

INSERT INTO Personnel (AutoID, Firstname, Surname) 
    SELECT CAST(@NewID AS nvarchar(255)), Firstname, Surname 
    FROM inserted; 

はまた、あなたが文字型を使用するとき、あなたは常には、長さを使用する必要があることに注意してください。デフォルトの長さは、コンテキストによって異なります。十分な長さでなければ、コードには見つけにくいバグがあります。

関連する問題