すべての変更(挿入、更新、削除)を保持するテーブルにトリガがあります。私は1つの時間当たり1行だけを挿入すると問題なく動作します。しかし、複数の行を一度に挿入しようとすると、次のエラーが表示されます。SQL Server 2012トリガ:行ごとに動的SQLを実行
サブクエリが2つ以上の値を返しました。 サブクエリが、=、!<、< =、>、> =、またはサブクエリが式 として使用されている場合は、これは許可されません。
ここトリガーのコード(I等変数宣言のようなコードを短くするために必要とされていないいくつかの部分を除去)
UPDATEである:実際のエラーは、これらの行にあるが#tempTrigTには複数の行が含まれています:
Select * into #tempTrigT from (select * from deleted where @Action in ('U','D')) A UNION (select * from inserted where @Action ='I')
set @sql = 'set @audit_oldvalue=(select cast([' [email protected] +'] as NVARCHAR(4000)) from #tempTrigT)';
EXEC SP_EXECUTESQL @sql,N'@audit_oldvalue sql_variant OUTPUT',@audit_oldvalue OUTPUT -- If inserted @audit_oldvalue gets the new value
set @sql = 'set @audit_value=(select cast(i.[' [email protected] +'] as NVARCHAR(4000)) from dbo.TForms i inner join #tempTrigT d on i.id = d.id)';
EXEC SP_EXECUTESQL @sql,N'@audit_value sql_variant OUTPUT',@audit_value OUTPUT
どのように複数の行でも動作するように変更できますか?
です。このエラーが発生した場合は、 '='を使ってサブクエリを探してください。次の2つがあります。 'set @ audit_oldvalue =(#tempTrigTからのキャスト(NVARCHAR(4000)としての '' + @ Item + ')とその下の次の' set'操作です。どちらも私に複数の価値を引き出すように見えます。 –
@AaronDietzしかし、私はこのエラーを受け取ってはいけません...そうですか? – aggicd
'=(サブクエリ)'を使用し、そのサブクエリが複数の値を返す場合、エラー –