Sql-Server

由於不正確的 SET 選項“QUOTED_IDENTIFIER”,SQL 作業中的 INSERT 失敗

  • April 6, 2022

我創建了一個 sql 作業來查詢計劃記憶體並單獨獲取串列計劃,然後將其從計劃記憶體中清除。作為 SQL 作業中步驟 1 的一部分,我僅過濾串列計劃並將其插入到我創建的表中。當我執行作業時,在步驟 1 本身中我收到以下錯誤;

INSERT failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'. Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or filtered indexes and/or query notifications and/or XML data type methods and/or spatial index operations. [SQLSTATE 42000] (Error 1934).  The step failed.

我做了研究並了解到這可能是由於 SET 選項。所以我檢查了我創建的表,它是用

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

我看到人們有同樣問題的文章,並在將上述 SET 選項更改為 ON 後解決了這個問題。我已經有了這個 SET,但仍然是同樣的錯誤。我不知道為什麼我會收到這個錯誤。

我在獲取串列計劃的查詢中有這一行。

WITH XMLNAMESPACES ( 'http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS p )

這是它的樣子:

WITH XMLNAMESPACES ( 'http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS p ),
relop AS (
SELECT      OBJECT_NAME(st.objectid, st.dbid) AS ObjectName,
           cp.creation_time,
--------------------
--------------------
----------------------
))
INSERT INTO table_name
select * from relop
WHERE relop.total_relop = relop.serial_relop

當我在查詢視窗上執行它時,沒有問題。當我把它放在工作中時,我得到了這個錯誤。

有什麼建議麼?

這不是創建表的方式,而是您的查詢執行的選項。

代理確實以錯誤的設置執行。

SELECT 
   s.*
FROM sys.dm_exec_sessions AS s
WHERE s.is_user_process = 1
AND    
(   
      s.ansi_nulls = 0
   OR s.ansi_padding = 0
   OR s.ansi_warnings = 0
   OR s.arithabort = 0
   OR s.concat_null_yields_null = 0
   OR s.quoted_identifier = 0 
);

簡單的解決方法是在執行插入的作業步驟開始時使用正確的選項。

例如,如果我創建這個表,插入就可以了:

USE master

CREATE TABLE dbo.whatever (id INT, thing AS id * 2);

INSERT dbo.whatever ( id )
VALUES ( 0 )

但是從代理工作步驟它失敗了,除非我把它放在第一位:

SET ANSI_NULLS ON;
SET ANSI_PADDING ON;
SET ANSI_WARNINGS ON;
SET ARITHABORT ON;
SET CONCAT_NULL_YIELDS_NULL ON;
SET QUOTED_IDENTIFIER ON;

供參考:創建索引視圖

堅果

引用自:https://dba.stackexchange.com/questions/216116