2013-06-21 25 views
5

如何在存储过程中创建索引?它抱怨如何在存储过程中创建索引?

消息102,级别15,状态1,过程createIndexModifiedOn,12号线
附近有语法错误 '主要'。

但是ON [PRIMARY]是SQL Server自身使用的,如果您创建新索引并选择Script As New Query

如果我删除ON [PRIMARY]那么它给这个错误

消息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执行它。

手绘例如:

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