Sql-Server

過濾索引拋出錯誤 - 更新失敗,因為以下 SET 選項的設置不正確:ANSI_WARNINGS

  • November 15, 2021

在執行 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

無論如何,您可以通過兩種方式解決它:

  1. 停止在 proc1 中將 ANSI_WARNINGS 設置為 OFF
  2. 在呼叫 proc2 之前打開 ANSI_WARNINGS

在我的情況下,它是由過濾索引引起的

CREATE UNIQUE NONCLUSTERED INDEX IX_PAYMENTS_apiKey
ON dbo.PAYMENTS(apiKey)
WHERE apiKey IS NOT NULL;

解決方案是更改ANSI_WARNINGS OFFLEFT(column, length).

引用自:https://dba.stackexchange.com/questions/105417