簡體   English   中英

使用QUOTED_IDENTIFIER克服'ALTER INDEX failed'錯誤

[英]Use of QUOTED_IDENTIFIER to overcome 'ALTER INDEX failed' error

之前的其他人一樣,今天在我的SQL日志中,我可以看到由於錯誤1934而導致預定作業無法執行。

ALTER INDEX失敗,因為以下SET選項的設置不正確:'QUOTED_IDENTIFIER'

這里在這里這里閱讀之后,我仍然不確定我的黑客 (下面)是否根據其他地方的建議引入風險。 我缺乏經驗是這個問題的主要驅動力。

原始代碼是:

DECLARE @Database varchar(255);
DECLARE @Table varchar(255);
DECLARE @cmd nvarchar(500);
DECLARE @fillfactor int = 90;

DECLARE DatabaseCursor CURSOR FOR
SELECT
    name
FROM
    MASTER.dbo.sysdatabases
WHERE
    name IN ('MyDbName')
ORDER BY
    name;

OPEN DatabaseCursor;
FETCH NEXT FROM DatabaseCursor INTO @Database;
WHILE (@@FETCH_STATUS = 0)
    BEGIN
        SET @cmd = 'DECLARE TableCursor CURSOR FOR SELECT ''['' + table_catalog + ''].['' + table_schema + ''].['' +
      table_name + '']'' as tableName FROM ' + @Database + '.INFORMATION_SCHEMA.TABLES
      WHERE table_type = ''BASE TABLE''';

        -- create table cursor  
        EXEC (@cmd);
        OPEN TableCursor;
        FETCH NEXT FROM TableCursor INTO @Table;
        WHILE (@@FETCH_STATUS = 0)
            BEGIN
                SET @cmd = 'ALTER INDEX ALL ON ' + @Table + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(varchar(3), @fillfactor) + ')';

                EXEC (@cmd);
                FETCH NEXT FROM TableCursor INTO @Table;
            END

        CLOSE TableCursor;
        DEALLOCATE TableCursor;
        FETCH NEXT FROM DatabaseCursor INTO @Database;
    END
CLOSE DatabaseCursor;
DEALLOCATE DatabaseCursor;

USE MyDbName;
GO
EXEC sys.sp_updatestats;

我相信在將索引添加到一個特定表中的XML列之后,這個錯誤就開始了,但我並不是100%肯定。 在其他地方,我們也有使用XPATH的存儲過程。 我知道其他人也經歷過同樣的錯誤,但是如果沒有手動設置QUOTED_IDENTIFIER的經驗,我正在尋找建議以及改進我的修復方法

根據我所讀到的內容,此修訂后的代碼執行時沒有錯誤:

 SET @cmd = 'SET QUOTED_IDENTIFIER ON; ' + 
            'ALTER INDEX ALL ON ' + @Table + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(varchar(3), @fillfactor) + ')';

我擔心的是:

  1. 這種變化是否會帶來任何不明顯的風險或其他危險(僅僅因為它運行沒有錯誤並不能解決我的緊張!)
  2. 如果沒有,有沒有辦法確定究竟是什么原因(例如,parituclar索引或DB列/程序)?
  3. 如果是這樣,那可以在動態SQL中加以考慮並更優雅地處理嗎?

提前感謝您分享您的專業知識。

  1. 不,沒有風險。
  2. 使用TRY / CATCH塊捕獲錯誤,以便您可以在某處記錄變量的內容。
  3. 您可以更改服務器屬性中的默認連接設置,以便QUOTED_IDENTIFIER始終處於打開狀態。 但是,它不是100%保證,因為數據訪問驅動程序可以覆蓋連接設置(不同的驅動程序 - ODBC,OLE DB,Native Client等 - 默認值略有不同)。

請將quoted_identifier選項設置為ON,然后再次測試

SET QUOTED_IDENTIFIER ON

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM