Sql-Server
過濾索引拋出錯誤 - 更新失敗,因為以下 SET 選項的設置不正確:ANSI_WARNINGS
在執行 proc1 時,我收到如下錯誤:
UPDATE 失敗,因為以下 SET 選項的設置不正確:“ANSI_WARNINGS”。驗證 SET 選項對於索引視圖和/或計算列上的索引和/或過濾索引和/或查詢通知和/或 XML 數據類型方法和/或空間索引操作是否正確。
我知道這種情況正在發生,因為我在客戶表上有一個過濾索引,並且需要 SET ANSI_WARNINGS ON。
即使我們需要一些 ANSI 選項,在創建過濾索引和儲存過程時也需要注意這些選項。這些事情我都處理過了。
我已經通過在 proc1 中設置 ansi_warning 解決了這個問題,我認為這是理想的解決方案。
但我的問題是,即使在 proc2 中設置了所有必需的 ANSI 選項後,為什麼我會收到此錯誤?任何想法?
下面是我的範常式式碼:
create Customers ( id int, name varchar(100), [Stats] BIT NOT NULL DEFAULT 1, ) go CREATE NONCLUSTERED INDEX [IX_Customers_Stats] ON [dbo].[Customers]([Stats]) WHERE [Stats] = 0 go CREATE PROC proc1 as BEGIN SET ANSI_WARNINGS OFF; SET NOCOUNT ON; .... ... .. some code ..... .... ... EXEC proc2 @customerId END go createPROCEDURE [dbo].[proc2 ] @customerId INT AS BEGIN SET ANSI_WARNINGS ON; SET ANSI_NULLS ON; SET ANSI_PADDING ON; SET ARITHABORT ON; SET CONCAT_NULL_YIELDS_NULL ON; SET NUMERIC_ROUNDABORT ON; SET QUOTED_IDENTIFIER ON; UPDATE dbo.Customers set Stats = 0 where id = @CustomerId END
可能是因為(來源):
在儲存過程中傳遞參數時不遵守 ANSI_WARNINGS
無論如何,您可以通過兩種方式解決它:
- 停止在 proc1 中將 ANSI_WARNINGS 設置為 OFF
- 在呼叫 proc2 之前打開 ANSI_WARNINGS
在我的情況下,它是由過濾索引引起的
CREATE UNIQUE NONCLUSTERED INDEX IX_PAYMENTS_apiKey ON dbo.PAYMENTS(apiKey) WHERE apiKey IS NOT NULL;
解決方案是更改
ANSI_WARNINGS OFF
為LEFT(column, length)
.