2013-06-21 3 views
5

Как создать индекс внутри хранимой процедуры? Он жалуетсяКак создать индекс внутри хранимой процедуры?

Msg 102, Level 15, State 1, процедура createIndexModifiedOn, строка 12
Неправильный синтаксис около 'PRIMARY'.

ON [PRIMARY] Но это то, что сам SQL Server использует при создании нового индекса и выберите Script As New Query.

Если удалить ON [PRIMARY] то это дает эту ошибку

Msg 102, уровень 15, состояние 1, процедура createIndexModifiedOn, линия 12
Неправильный синтаксис около ')'.

Вот процедура:

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 

Это закончилось тем, что был полный запрос:

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 "?"' 

ответ

4

Вы не можете использовать переменные в операторе CREATE INDEX, как у вас есть. Для этого вам нужно создать строку SQL и выполнить ее с помощью sp_executesql.

Freehand пример:

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