![](/img/trans.png)
[英]ALTER INDEX failed because of QUOTED_IDENTIFIER when running from sp_msForEachTable
[英]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) + ')';
我擔心的是:
提前感謝您分享您的專業知識。
TRY / CATCH
塊捕獲錯誤,以便您可以在某處記錄變量的內容。 QUOTED_IDENTIFIER
始終處於打開狀態。 但是,它不是100%保證,因為數據訪問驅動程序可以覆蓋連接設置(不同的驅動程序 - ODBC,OLE DB,Native Client等 - 默認值略有不同)。 請將quoted_identifier選項設置為ON,然后再次測試
SET QUOTED_IDENTIFIER ON
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.