5

我创建了一个具有默认设置的存储过程,例如:

SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO

Create  PROCEDURE [dbo].[TestSP] 
AS
BEGIN
   set arithabort off
   set arithignore on
   --.....
END

没事。然后我在一个表上为 DB 中的非空值创建了一个过滤的唯一索引,然后我不能再在 SQL Server Management Studio 中运行任何存储过程。我得到的错误是这样的:

DELETE(或 INSERT)失败,因为以下 SET 选项的设置不正确:'ANSI_NULLS,QUOTED_IDENTIFIER'。验证 SET 选项对于索引视图和/或计算列上的索引和/或过滤索引和/或查询通知和/或 XML 数据类型方法和/或空间索引操作是否正确。

我尝试运行存储过程,例如:

SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
EXEC TestSP

或者

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
EXEC TestSP

我仍然得到上述错误。我很困惑。如何解决这个问题?

4

4 回答 4

2

ANSI_NULLS 和 QUOTED_IDENTIFIER 的设置基于您创建/更改过程时的设置,而不是您运行该过程的实例中的设置。

您想为您的 TestSP 运行一个 ALTER PROC,在您运行它时至少将 QUOTED_IDENTIFIER 设置为 ON。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[TestSP] 

AS
BEGIN
   set arithabort off
   set arithignore on
   --.....
END
于 2013-04-23T19:46:49.860 回答
1

只是我的2c。

我经常将这些消息放入SET ANSI_WARNINGS OFF 的 procs 中,因为这些消息让我烦恼,并且有时这些警告会错误地通过 SSIS 包冒泡到 SQL 代理作业,并错误地将 SSIS 包报告为失败。

添加过滤索引后出现此错误。我现在已经删除了SET ANSI_WARNINGS OFF. 我的 proc 现在可以工作了,我会看看那个 SSIS 问题是否真实存在。

于 2019-01-11T04:35:16.930 回答
0

我刚刚遇到这种情况,原因与文件属性和我在 Visual Studio 上的数据库项目(即myDatabase.dbproj)的部署过程有关。

错误的根本原因是必须创建存储过程的上下文。数据库选项ANSI_NULLSQUOTED_IDENTIFIER必须在创建存储过程之前设置(在sp代码中设置这些选项并没有错,但是没用)。

如果我将存储过程的源代码复制并粘贴到 SQL Server Management Studio,存储过程就会运行,所以我很确定问题是由SET部署上下文的选项不同引起的。然后我检查了这些设置(Database.sqlsettings),一切正常:ANSI_NULLS并且QUOTED_IDENTIFIER设置正确,但问题仍然存在......

直到我发现每个对象文件在数据库项目上都有一个属性条目(右键单击文件名以显示对话框)。这些属性实际上是在覆盖数据库设置,所以我将它们更改为Project Default,问题就解决了。

sql-文件-属性-对话框

PS:我做了更多的测试,从 Visual Studio 创建新的存储过程,并使用模式比较导入手动创建的存储过程,并且文件是使用Project Default.

于 2013-07-11T11:27:02.357 回答
0

这似乎是 SQL Server 问题(不一致?)。如果满足以下条件,则会生成错误“INSERT failed because the following SET options has wrong settings:”QUOTED_IDENTIFIER:

  • 该表有一个允许 NULL 的列,但没有定义默认值,例如:

[LookupID] [int] NULL

  • 此列上定义了唯一的过滤索引

    Create Unique nonclustered index [UniqueExceptNulls] on [tablename]
      ( [lookupID] asc)  where ([LookupID] is not NULL)
    

解决方案:将默认约束添加到 [LookupID] 列:

ALTER TABLE [tablename] add CONSTRAINT [DF_TableName_lookupID] DEFAULT (NULL) FOR [lookupID]
于 2013-05-23T20:53:04.560 回答