Comment créer un index dans une procédure stockée? Il se plaint
Msg 102, niveau 15, état 1, procédure createIndexModifiedOn, ligne 12
Syntaxe incorrecte près de 'PRIMARY'.
Mais ON [PRIMARY]
est ce que SQL Server lui-même utilise si vous créez un nouvel index et select Script As New Query
.
Si j'enlève ON [PRIMARY]
alors il donne cette erreur
Msg 102, niveau 15, état 1, procédure createIndexModifiedOn, ligne 12
Syntaxe incorrecte près de ')'.
Voici la procédure:
create proc [dbo].createIndexModifiedOn @table char(256) as begin declare @idx char(256) set @idx = 'idx_' + SUBSTRING(@table, 7, len(@table)-1) + '_modified_on'; IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(@table) AND name = @idx) DROP INDEX [@idx] ON [@table] CREATE NONCLUSTERED INDEX [@idx] ON [@table] ( [modified_on] ASC ) ON [PRIMARY] go
Cela a fini par être la requête complète:
create proc [dbo].createIndexModifiedOn @table varchar(256) as declare @idx varchar(256); declare @sql nvarchar(999); set @idx = 'idx_' + SUBSTRING(@table, 8, len(@table)-8) + '_modified_on'; set @sql = ' IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(''' + @table + ''') AND name = ''' + @idx + ''') DROP INDEX [' + @idx + '] ON ' + @table + ' CREATE NONCLUSTERED INDEX [' + @idx + '] ON ' + @table + ' ( [modified_on] ASC ) ON [PRIMARY] '; print @table + ', ' + @idx; BEGIN TRY EXEC sp_executesql @sql; END TRY BEGIN CATCH PRINT 'errno: ' + lsortingm(str(error_number())) PRINT 'errmsg: ' + error_message() END CATCH GO EXEC sp_MSforeachtable 'exec createIndexModifiedOn "?"'
Vous ne pouvez pas utiliser de variables dans l'instruction CREATE INDEX comme vous l'avez fait. Pour ce faire, vous devrez générer une string SQL et l'exécuter avec sp_executesql
.
Exemple à main levée:
DECLARE @sql NVARCHAR(1024); SET @sql = 'CREATE NONCLUSTERED INDEX [' + @idx + '] ON [' + @table + '] ( [modified_on] ASC ) ON [PRIMARY];'; EXEC sp_executesql @sql;