Wie füge ich jedem Tisch mit sp_MSforeachtable einen Index hinzu? Es gibt immer Fehlermeldungen.
EXEC sp_MSforeachtable @precommand = 'declare @idx as char;',
@command1 = '
set @idx = ''idx_'' + ? + ''_modified_on'';
print @idx;
IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N''[dbo].[?]'') AND name = N''@idx'')
DROP INDEX [@idx] ON [dbo].[?]
CREATE NONCLUSTERED INDEX [@idx] ON [dbo].[?]
(
[modified_on] ASC
) ON [PRIMARY]
'
Ein solcher Fehler:
Msg 137, Level 15, State 1, Zeile 2
Muss die skalare Variable "@idx" deklarieren.
Ich versuche das declare innerhalb des Befehls zu platzieren, aber dann erhalte ich diesen Fehler:
Msg 4104, Level 16, State 1, Zeile 3
Der mehrteilige Bezeichner "dbo.DIAG_contractAuditHistory" konnte nicht gebunden werden.
Hier ist ein aktualisierter Versuch, Syntaxfehler zu beheben, mit Test-SQL, aber es gab immer noch seltsame Fehler. Letztendlich löste ich das Problem mit einem gespeicherten Verfahren und rufte das gespeicherte Verfahren für jeden Tisch auf.
EXEC sp_MSforeachtable @command1 = '
declare @idx as varchar(256);
set @idx = ''idx_'' + SUBSTRING(''?'', 8, len(''?'')-8) + ''_modified_on'';
print @idx;
IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N''?'') AND name = @idx )
DROP INDEX [@idx] ON ?
IF EXISTS (select * from sys.columns where object_id = OBJECT_ID(N''?'') and name = ''modified_on'')
CREATE NONCLUSTERED INDEX [@idx] ON ?
(
[modified_on] ASC
) ON [PRIMARY]
'
declare @cat as char;
set @cat='dog';
print @cat;
EXEC sp_MSforeachtable 'print ''idx_'' + SUBSTRING(''?'', 8, len(''?'')-8) + ''_modified_on'';'
EXEC sp_MSforeachtable 'print ''?'''
print substring('[dbo].[merchantNotes]', 8, (len('[dbo].[merchantNotes]')-9))
select * from sys.columns where object_id = OBJECT_ID(N'[dbo].[banks]') and name = 'modified_on'
SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'contractPaymentHistory') AND name = 'idx_contractPaymentHistory_modified_on'
Dies würde für etwa zwei Dutzend Tabellen funktionieren, dann gibt es seltsame Fehler wie
Msg 1934, Level 16, State 1, Zeile 9 CREATE INDEX fehlgeschlagen, da die folgenden SET-Optionen falsch eingestellt sind: 'QUOTED_IDENTIFIER'. Stellen Sie sicher, dass SET-Optionen korrekt sind für die Verwendung mit indizierten Ansichten und/oder Indizes auf berechneten Spalten und/oder gefilterten Indizes und/oder Abfragebenachrichtigungen und/oder XML-Datentypmethoden und/oder Operationen mit räumlichen Indizes.
Also habe ich eine andere Strategie verwendet und ein gespeichertes Verfahren erstellt, um die Indizes zu erstellen: Wie erstelle ich einen Index innerhalb eines gespeicherten Verfahrens?