我FOR XML PATH在我的存盤程序中使用,所以我需要QUOTED_IDENTIFIER設定為ON. 我把它作為我的存盤程序的第一個陳述句。
SET QUOTED_IDENTIFIER ON;
除了我第一次恢復我的資料庫之外,這一直作業正常。
剛剛恢復資料庫后,我檢查了一下sp_helptext <SPName>,存盤程序似乎沒問題。

但是,當我從物件資源管理器瀏覽我的存盤程序并單擊“修改”時,它顯示:

當我嘗試使用EXEC <SP_Name>它執行存盤程序時會引發錯誤
SELECT 失敗,因為以下 SET 選項的設定不正確:“QUOTED_IDENTIFIER”。驗證 SET 選項是否正確用于計算列上的索引視圖和/或索引和/或過濾索引和/或查詢通知和/或 XML 資料型別方法和/或空間索引操作。

有人可以指導我為什么 SQL ServerSET QUOTED_IDENTIFIER OFF自己添加嗎?如何擺脫它?或者我們如何從存盤程序中覆寫它?
如果我SET QUOTED_IDENTIFIER OFF從頂部洗掉,重新執行/運行它,那么它會正常作業。
我的問題是 - 我們有自動化程序,可以在每次構建時運行遷移/創建資料庫,所以我不能一直手動洗掉它。我也不能在資料庫級別設定它。
我檢查了它的資料庫設定及其設定,false但這應該沒有任何區別,對嗎?因為我在我的存盤程序中有專門的 SET To ON 。

先感謝您。
uj5u.com熱心網友回復:
QUOTED_IDENTIFIER 資料庫設定無關緊要。這只是一個默認值,每個客戶端驅動程式在連接時設定 QUOTED_IDENTIFIER 并覆寫資料庫默認值。
存盤程序中的 SET QUOTED_IDENTIFIER 無關緊要;去掉它。
當 SET QUOTED_IDENTIFIER 作為靜態 Transact-SQL 出現在存盤程序的主體中時,它不起作用。

意味著存盤程序是在 QUOTED_IDENTIFIER OFF 的情況下創建的。如您所見,呼叫存盤程序的會話的會話設定無關緊要。
創建存盤程序時,SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 設定被捕獲并用于該存盤程序的后續呼叫。
設定 QUOTED_IDENTIFIER
此存盤程序的設定還控制存盤程序中動態 SQL 的 QUOTED_IDENTIFIER 設定。但是在動態 SQL 中,您可以更改設定。
所以是的
我的問題是 - 我們有自動化流程,可以在每次構建時運行遷移/創建資料庫
這個程序被破壞了,因為它正在用 QUOTED_IDENTIFIER OFF 創建你的程序。如果您無法修復它,您可以通過將 TSQL 推送到動態批處理中并在動態 SQL 中設定 QUOTED_IDENTIFIER ON 來解決它。例如
set quoted_identifier off
go
create or alter procedure foo
as
begin
exec ('set quoted_identifier on; select * from "sys"."objects"')
end
go
exec foo --suceeds
你也可以讓你的存盤程序創建腳本依賴于 QUOTED_IDENTIFIER ON 所以你不可能在 QUOTED_IDENTIFIER OFF 的情況下創建它,例如
set quoted_identifier off
go
create or alter procedure foo
as
begin
select * from "sys"."objects"
end
失敗
Msg 102, Level 15, State 1, Procedure foo, Line 4 [Batch Start Line 2]
Incorrect syntax near 'sys'.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/389539.html
標籤:sql-server 引用标识符
上一篇:為每一行分配一個字母列
