2013-06-21 36 views
5

Làm cách nào để tạo chỉ mục bên trong quy trình được lưu trữ? Nó phàn nànLàm cách nào để tạo chỉ mục bên trong quy trình được lưu trữ?

Msg 102, Level 15, State 1, Thủ tục createIndexModifiedOn, Line 12
cú pháp sai gần 'TIỂU'.

Nhưng ON [PRIMARY] chính là những gì SQL Server sử dụng nếu bạn tạo chỉ mục mới và chọn Script As New Query.

Nếu tôi loại bỏ ON [PRIMARY] sau đó nó mang lại cho lỗi này

Msg 102, Level 15, State 1, Thủ tục createIndexModifiedOn, Line 12
cú pháp sai gần ')'.

Dưới đây là thủ tục:

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 

này kết thúc lên được đầy đủ các truy vấn:

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

Trả lời

4

Bạn không thể sử dụng các biến trong câu lệnh CREATE INDEX là bạn có. Để làm điều này, bạn sẽ cần phải tạo một chuỗi SQL và thực thi nó với sp_executesql.

Ví dụ tự do:

DECLARE @sql NVARCHAR(1024); 
SET @sql = 'CREATE NONCLUSTERED INDEX [' + @idx + '] ON [' + @table + '] 
(
    [modified_on] ASC 
) ON [PRIMARY];'; 
EXEC sp_executesql @sql; 
Các vấn đề liên quan