过滤索引抛出错误 - 更新失败,因为以下 SET 选项设置不正确:ANSI_WARNINGS

Ash*_*han 6 sql-server filtered-index

执行proc1时,出现如下错误:

更新失败,因为以下 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  
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 4

可能是因为(来源):

在存储过程中传递参数时不遵守 ANSI_WARNINGS

无论如何,您可以通过两种方式解决这个问题:

  1. 停止在 proc1 中将 ANSI_WARNINGS 设置为 OFF
  2. 在调用 proc2 之前打开 ANSI_WARNINGS