When I try to rebuild an index on a table:
ALTER INDEX ALL ON [dbo].[Allocations] REBUILD
that works fine.
But when I call
EXECUTE sp_msForEachTable 'ALTER INDEX ALL ON ? REBUILD'
I reach the same same table, and it fails with:
Msg 1934, Level 16, State 1, Line 2
ALTER INDEX 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.
And to confirm that it’s the same table:
EXECUTE sp_msForEachTable 'print ''Rebuilding ?'';
ALTER INDEX ALL ON ? REBUILD;
PRINT '' Done ?'''
which gives the results:
Rebuilding [dbo].[SystemConfiguration]
Done [dbo].[SystemConfiguration]
Rebuilding [dbo].[UserGroups]
Done [dbo].[UserGroups]
Rebuilding [dbo].[Groups]
Done [dbo].[Groups]
Rebuilding [dbo].[UserPermissions]
Done [dbo].[UserPermissions]
Rebuilding [dbo].[AllocationAdmins]
Done [dbo].[AllocationAdmins]
Rebuilding [dbo].[Allocations]
Msg 1934, Level 16, State 1, Line 2
ALTER INDEX 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.
What am I not doing wrong?
Note:
EXECUTE sp_msForEachTable 'DBCC DBREINDEX(''?'')'
works fine!
Quoted identifier settings are stored against each stored procedure, and
sp_MSforeachtablehas it defined asOFF. However, you can work around this – by setting it toONbefore it executes the re-index:SET QUOTED_IDENTIFIER:And, of course, insert the usual caveats about
sp_MSforeachtablebeing undocumented, and so you can’t rely on any of its behaviour being stable.For
DBCC DBREINDEX– all bets are off.DBCClives in its own little, very customized code world. But, of course, it shouldn’t be relied on for future work either: