gpt4 book ai didi

sql-server - 使用 QUOTED_IDENTIFIER 克服 'ALTER INDEX failed' 错误

转载 作者:行者123 更新时间:2023-12-02 22:38:01 25 4
gpt4 key购买 nike

喜欢others previously ,今天在我的 SQL 日志中我可以看到计划的作业由于错误 1934 而无法执行。

ALTER INDEX failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'

阅读后here , herehere ,我仍然不确定我的黑客(如下)是否根据其他地方给出的建议引入了风险。我缺乏经验是这个问题的主要原因。

原代码为:

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. 如果不是,是否有办法准确识别导致此问题的原因(例如并行索引或数据库列/过程)?
  3. 如果是这样,是否可以在动态 SQL 中对此进行解释并进行更优雅的处理?

预先感谢您分享您的专业知识。

最佳答案

  1. 不会,没有风险。
  2. 使用 TRY/CATCH block 捕获错误,以便您可以在某处记录变量的内容。
  3. 您可以更改服务器属性中的默认连接设置,以便 QUOTED_IDENTIFIER 始终处于开启状态。但是,这并不是 100% 的保证,因为数据访问驱动程序可以覆盖连接设置(不同的驱动程序 - ODBC、OLE DB、Native Client 等 - 默认值略有不同)。

关于sql-server - 使用 QUOTED_IDENTIFIER 克服 'ALTER INDEX failed' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40341539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com