Penyata kemas kini SQL Server: Menyelesaikan konflik antara klausa output dan pencetus
Melaksanakan pernyataan dengan klausa UPDATE
dalam SQL Server boleh mengakibatkan ralat ("Tidak boleh menggunakan Kemas Kini dengan klausa output apabila pencetus berada di atas meja") jika pencetus didayakan pada jadual yang terjejas. Batasan ini berpunca daripada potensi pencetus untuk mengubah suai data selepas klausa OUTPUT
menangkap nilainya, yang membawa kepada ketidakkonsistenan. OUTPUT
Masalah dijelaskan
ralat timbul kerana SQL Server tidak dapat menentukan nilai output akhir apabila pencetus terlibat. Pemicu mungkin mengubah data sebelum klausa selesai, menjadikan nilai yang dikembalikan tidak tepat. Ini benar terutamanya apabila menggunakan klausa OUTPUT
tanpa klausa OUTPUT
. INTO
Penyelesaian
Dua penyelesaian utama mengelakkan batasan ini:
kaedah 1: menggunakan klausa INTO
. Ini mengasingkan output dari pengubahsuaian pencetus yang berpotensi: INTO
<code class="language-sql">UPDATE BatchReports SET IsProcessed = 1 OUTPUT inserted.* INTO @t -- @t is a table variable or temporary table WHERE BatchReports.BatchReportGUID = @someGuid</code>
selepas dan sebarang tindakan pencetus yang berkaitan. UPDATE
kaedah 2: berasingan dan SELECT
pernyataan UPDATE
SELECT
sebelum melaksanakan : UPDATE
<code class="language-sql">SELECT BatchFileXml, ResponseFileXml, ProcessedDate INTO #tempTable -- Create a temporary table FROM BatchReports WHERE BatchReports.BatchReportGUID = @someGuid; UPDATE BatchReports SET IsProcessed = 1 WHERE BatchReports.BatchReportGUID = @someGuid; SELECT * FROM #tempTable; -- Access the desired values from the temporary table</code>
menangkap data asal, tidak terjejas oleh tindakan pencetus berikutnya semasa SELECT
. UPDATE
Nota Penting: Mengelakkan dengan pencetus OUTPUT
secara langsung dengan pencetus umumnya tidak digalakkan. Potensi untuk percanggahan antara nilai OUTPUT
dan keadaan data akhir selepas pencetus pelaksanaan menjadikan pendekatan ini tidak dapat dipercayai. Penyelesaian yang digariskan di atas memberikan hasil yang lebih selamat dan lebih diramalkan. OUTPUT
Atas ialah kandungan terperinci Mengapa SQL Server menghalang kemas kini dengan klausa output apabila pencetus wujud?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!