2013-06-21 9 views
5

Come si crea un indice all'interno di una stored procedure? Si lamentaCome posso creare un indice all'interno di una stored procedure?

Msg 102, livello 15, stato 1, procedura createIndexModifiedOn, Linea 12
la sintassi non corretta in prossimità 'primaria'.

Ma ON [PRIMARY] è ciò che si utilizza SQL Server se si crea un nuovo indice e selezionare Script As New Query.

Se rimuovo ON [PRIMARY] allora si dà questo errore

Msg 102, livello 15, stato 1, procedura createIndexModifiedOn, Linea 12
la sintassi non corretta in prossimità ')'.

Ecco la procedura:

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 

Questo ha finito per essere la query completa:

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: ' + ltrim(str(error_number())) 
     PRINT 'errmsg: ' + error_message() 
    END CATCH 
GO 

EXEC sp_MSforeachtable 'exec createIndexModifiedOn "?"' 

risposta

4

Non è possibile utilizzare le variabili nell'istruzione CREATE INDEX come si deve. Per fare ciò, è necessario generare una stringa SQL ed eseguirla con sp_executesql.

esempio a mano libera:

DECLARE @sql NVARCHAR(1024); 
SET @sql = 'CREATE NONCLUSTERED INDEX [' + @idx + '] ON [' + @table + '] 
(
    [modified_on] ASC 
) ON [PRIMARY];'; 
EXEC sp_executesql @sql; 
Problemi correlati