2013-04-23 71 views
4

我創建一個存儲過程使用默認設置,如:刪除/插入SQL Server 2008上的篩選索引失敗?

SET ANSI_NULLS OFF 
GO 
SET QUOTED_IDENTIFIER OFF 
GO 

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

這是好的。然後,我在表中爲數據庫中的非空值創建了過濾的唯一索引,然後我無法在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 

我仍然得到上述錯誤。我很困惑。如何解決這個問題?

+1

如果在創建存儲過程時設置了ansi_nulls,會發生什麼情況? – 2013-04-23 19:43:13

+1

你爲什麼用這兩個設置'OFF'創建程序?你知道['SET ANSI_NULLS OFF'已被棄用,因爲SQL Server 2005](http://msdn.microsoft.com/en-us/library/ms143729(v = sql.90).aspx),對不對?停止使用它。 – 2013-04-23 19:46:47

回答

1

兩個ANSI_NULLS和QUOTED_IDENTIFIER的設置是基於在創建/修改程序的設置是什麼,而不是在實例的設置運行中的程序。

你想運行一個ALTER PROC爲TestSP在運行時至少將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 
0

這似乎是SQL Server問題(不一致?)。該錯誤「INSERT失敗,因爲下列SET選項的設置不正確:‘如果滿足以下條件QUOTED_IDENTIFIER’將生成:

  • 表中有一列允許空值,但沒有默認值已被定義,前:

[LookupID] [int] NULL

  • 有此列

    012定義的唯一篩選索引

解決方案: 添加默認約束列[lookupId所]:

ALTER TABLE [tablename] add CONSTRAINT [DF_TableName_lookupID] DEFAULT (NULL) FOR [lookupID] 
0

我只是碰到了這種情況,原因是有關一個文件屬性部署的過程我的數據庫項目在Visual Studio(即myDatabase.dbproj)。

錯誤的根本原因是必須創建存儲過程的上下文。數據庫選項ANSI_NULLSQUOTED_IDENTIFIER必須設置之前創建存儲過程(將這些選項設置爲sp代碼不是錯誤,但它是無用的)。

如果我將源複製並粘貼到SQL Server Management Studio中,存儲過程會運行,所以我非常確定問題是由部署上下文的SET選項上的差異引起的。然後我檢查這些設置(Database.sqlsettings),一切都OK:ANSI_NULLSQUOTED_IDENTIFIER進行正確設置,但問題依然存在......

直到我發現每個對象文件具有屬性數據庫進入項目(右鍵單擊文件名顯示對話框)。這些屬性實際上覆蓋了數據庫設置,所以我將它們更改爲Project Default,問題解決了。

sql-file-properies-dialog

PS:我做更多的測試,創建從Visual Studio新的存儲過程和導入使用模式比較手動創建者和文件與Project Default創建的,所以我認爲這個設置手動更改或錯誤地從以前版本的Visual Studio導入。