2009-11-11 20 views
7

我有一個存儲過程,它接受一個XML參數並將數據插入到多個表中。如果我使用SSMS查詢窗口將存儲過程運行到數據庫中,則一切正常。但是,我們有一個用於部署存儲過程到數據庫自定義安裝程序,這是使用時,SP的執行失敗,此錯誤:SQL Server存儲過程由於使用XML/ANSI_NULLS,QUOTED_IDENTIFIER選項而失敗

INSERT failed because the following SET options have incorrect settings: 
'ANSI_NULLS, QUOTED_IDENTIFIER'. Verify that SET options are correct for use with 
indexed views and/or indexes on computed columns and/or query notifications 
and/or xml data type methods. 

自定義安裝程序沒有使用正確的設置當在存儲過程中編寫腳本時。

設置這些(SET ARITHABORT ON; SET QUOTED_IDENTIFIER ON; SET ANSI_NULLS ON)的SP內沒有任何效果:

我也試圖打電話只是在SP中的代碼之前設置這些選項的開放連接。這再次沒有預期的效果。

看來,連接到數據庫而SP則到數據庫正在運行的設置是什麼事情,當使用SP的設置。

我已經嘗試過在SSMS選項中使用這些設置,這似乎確實如此。 我只想有人確認這絕對是這種情況(如果有一種方法我很想聽到它,但我不希望)

不幸的是,更改安裝程序不是一種選擇我現在是這樣,所以我正在考慮不得不回滾幾個星期的工作;所以如果我確實必須這樣做,我想確定(並且有一些證據支持我),這是唯一的選擇

回答

11

應用於CREATE或ALTER時間的設置在運行時會被忽略。

默認情況下,SSMS具有正確的設置(sqlcmd,osql等也是如此)。

BOL, CREATE PROC, "Using SET Options"

The Database Engine saves the settings of both SET QUOTED_IDENTIFIER and SET ANSI_NULLS when a Transact-SQL stored procedure is created or modified. These original settings are used when the stored procedure is executed. Therefore, any client session settings for SET QUOTED_IDENTIFIER and SET ANSI_NULLS are ignored when the stored procedure is running. Other SET options, such as SET ARITHABORT, SET ANSI_WARNINGS, or SET ANSI_PADDINGS are not saved when a stored procedure is created or modified.

+1

謝謝,這是完美的 – DannykPowell 2009-11-11 12:00:11