为什么我在'附近的关键字'附近出现语法错误?

时间:2015-01-09 01:24:24

标签: sql sql-server sql-server-2008

--Use 'Database'
BEGIN TRAN

declare @name1 varchar(150)
declare @name2 varchar(150)

declare CRS Cursor for 
    SELECT 
        OBJECT_NAME(ind.OBJECT_ID) AS DBtable,
        ind.name AS IndexName   
    FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) indexstats 
        INNER JOIN sys.indexes ind  
        ON ind.object_id = indexstats.object_id 
        AND ind.index_id = indexstats.index_id 
    WHERE indexstats.avg_fragmentation_in_percent > 10 and ind.name is not null
    ORDER BY indexstats.avg_fragmentation_in_percent DESC;
open CRS
    fetch Next from CRS into @name1,@name2

    While (@@FETCH_STATUS=0)
     begin
       select @name1 as [Table name],@name2 as [Index name];

          ALTER INDEX @name2 ON @name1 REBUILD PARTITION = ALL 
          WITH (fillfactor=85,  PAD_INDEX  = on, STATISTICS_NORECOMPUTE  = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, ONLINE = on, SORT_IN_TEMPDB = on )

       fetch next from CRS into @name1,@name2;
     end

 close CRS
 Deallocate CRS      

ROLLBACK

错误消息

  

关键字'附近的语法不正确(用于重建索引)。如果   此语句是一个公用表表达式,一个xmlnamespaces子句   或者更改跟踪上下文子句,前面的语句必须是   以分号结尾

1 个答案:

答案 0 :(得分:1)

您需要使用Dynamic Sql。试试这个。

BEGIN TRAN

DECLARE @name1 VARCHAR(150)
DECLARE @name2 VARCHAR(150)
DECLARE CRS CURSOR FOR
  SELECT Object_name(ind.OBJECT_ID) AS DBtable,
         ind.NAME                   AS IndexName
  FROM   sys.Dm_db_index_physical_stats(Db_id(), NULL, NULL, NULL, NULL) indexstats
         INNER JOIN sys.indexes ind
                 ON ind.object_id = indexstats.object_id
                    AND ind.index_id = indexstats.index_id
  WHERE  indexstats.avg_fragmentation_in_percent > 10
         AND ind.NAME IS NOT NULL
  ORDER  BY indexstats.avg_fragmentation_in_percent DESC;

OPEN CRS

FETCH Next FROM CRS INTO @name1, @name2

WHILE ( @@FETCH_STATUS = 0 )
  BEGIN

      DECLARE @sql NVARCHAR(max)

      SET @sql='ALTER INDEX ' + Quotename(@name2) + ' ON '
               + Quotename(@name1)
               + ' REBUILD PARTITION = all WITH (FILLFACTOR=85, PAD_INDEX = ON, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, ONLINE = ON, SORT_IN_TEMPDB = ON )'

      EXEC sp_executesql
        @sql

      FETCH next FROM CRS INTO @name1, @name2;
  END

CLOSE CRS