2013-06-21 27 views
5

ストアドプロシージャ内でインデックスを作成するにはどうすればよいですか?これはメッセージ102、レベル15、状態1、プロシージャcreateIndexModifiedOn、ライン12
'PRIMARY' 付近に不適切な構文ストアドプロシージャ内でインデックスを作成するにはどうすればよいですか?

を文句を言います。

しかしON [PRIMARY]新しいインデックスを作成し、Script As New Queryを選択した場合、SQL Server自体が使用するものです。

私はその後、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; 
関連する問題