如何在存储过程中创建索引? [英] How do I create an index inside a stored procedure?

查看:94
本文介绍了如何在存储过程中创建索引?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

How do I create an index inside a stored procedure? It complains

消息 102,级别 15,状态 1,过程 createIndexModifiedOn,第 12 行
PRIMARY"附近的语法不正确.

Msg 102, Level 15, State 1, Procedure createIndexModifiedOn, Line 12
Incorrect syntax near 'PRIMARY'.

但是 ON [PRIMARY] 是 SQL Server 本身在创建新索引并选择 Script As New Query 时使用的.

But ON [PRIMARY] is what SQL Server itself uses if you create a new index and select Script As New Query.

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

If I remove ON [PRIMARY] then it gives this error

消息 102,级别 15,状态 1,过程 createIndexModifiedOn,第 12 行
')' 附近的语法不正确.

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

推荐答案

您不能在 CREATE INDEX 语句中使用变量.为此,您需要生成一个 SQL 字符串并使用 sp_executesql 执行它.

You can't use variables in the CREATE INDEX statement as you have. To do this, you will need to generate a SQL string and execute it with sp_executesql.

手绘示例:

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

这篇关于如何在存储过程中创建索引?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆