我有一個包含以下代碼(簡化和通用)的存盤程序:
UPDATE t
SET t.intFoo = @foo,
t.intBar = @bar,
t.intBaz = tst.intBaz
FROM dbo.myTable t,
dbo.myOtherTable tst
WHERE (t.id = @myId)
AND (tst.alias = 'Alias')
@foo在存盤程序中較早地生成,而@bar作為int引數傳入。intBar已知在表中的每一行都為空。
呼叫存盤程序后,當我檢查資料庫中更新的行時,我看到intFoo并intBaz已正確設定,但intBar仍設定為 null。即使我明確地intBar將要設定的值硬編碼為:
UPDATE t
SET t.intFoo = 12345, --this gets stored in the targeted row
t.intBar = 54321, --this does not; it remains null
...
intBar是一個完全普通的列,沒有任何約束或任何會阻止它被設定的東西:
...
[intBar] [int] NULL
我已經單獨運行了存盤程序,并確認 a)@bar被正確傳遞并且不為空,并且 b) 的值intBar沒有被另一個存盤程序覆寫。我已經嘗試單獨運行該UPDATE陳述句,并且再次,intBar當所有其他值都更新時,它沒有更新。
這里發生了什么?為什么我的存盤程序會更新我要求的一些值,但不是全部?
uj5u.com熱心網友回復:
經過仔細檢查,結果發現表上有一個控制更新的觸發器。(我一開始找不到它,因為這是非常混亂的遺留代碼,沒有什么是你期望的。)intBar只是最近才添加到表中,當時一定沒有添加到觸發器中,因此它不是'不包含在更新中。
我更新了觸發器以包含intBar,現在它可以完美運行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/439475.html
