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

6
如何在存储过程中创建索引?但是它会出错:Msg 102, Level 15, State 1, Procedure createIndexModifiedOn, Line 12 Incorrect syntax near 'PRIMARY'。但是SQL Server本身在创建新的索引并选择“Script As New Query”时使用的是“ON [PRIMARY]”。如果我删除“ON [PRIMARY]”,则会出现以下错误:Msg 102,Level 15,State 1,Procedure createIndexModifiedOn,Line 12 Incorrect syntax near ')'。以下是存储过程内容:
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 "?"'
1个回答

6

按照您的方式无法在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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接