2012-02-06 26 views
2

我需要为下表所示的表创建聚簇索引和非聚簇索引。当我尝试创建临时表的索引时,它的工作正常。当我尝试为此表创建索引时,它会引发语法错误。为存储过程中创建的表添加索引

DECLARE @SearchReviseBudget TABLE(   
    id     INT IDENTITY(1, 1),   
    fundid    BIGINT,   
    programid   BIGINT ,   
    projectid   BIGINT,   
    applicationnumber VARCHAR(50),   
    applicationname VARCHAR(100),   
    startdate   DATETIME,   
    enddate   DATETIME,   
    programtypeidfkid VARCHAR(50),   
    applicationbudget MONEY,   
    utlized   MONEY ,  
    [Left]    MONEY,   
    companyname  VARCHAR(100),   
    multiyearbudgetid BIGINT,   
    totalprogrambudget MONEY)   

    ---inserting sum of amount for projects       
    INSERT INTO @SearchReviseBudget   
       (programid,   
       fundid,   
       utlized)   
    SELECT programid,   
     fundid,   
     SUM([Utilized])   
    FROM dbo.getapplicationbudgetandutilized   
    WHERE fundid IN(SELECT pkid              
       FROM fundrequestheader          
     WHERE pkid IN (select pkid from @TempInvoice         

      ))    

     AND programid IN (SELECT programidfkid   
          FROM usermaster u,   
            programaccountconfiguration pac   
          WHERE   
      u.accountcontactidfkid = pac.acccontactidfkid   
      AND pac.accountidfkid = (SELECT accountidfkid   
             FROM accountcontacts   
             WHERE   
       pkid IN (@AccContactPKID)   
            )   
      AND u.isactive = 1   
      AND pac.isactive = 1   
      AND u.accountcontactidfkid IN (SELECT contactid   
              FROM   
       #tempcontactid))   
     --and ProjectID not in (select pkid from installationtransactionheader where parentprjnumber is null and isnull(paymentschedule,0)=1)            
     AND [Left] > 0.00   
    GROUP BY fundid,   
      programid   
+0

是MS SQLServer吗?你有什么错误? – Mat 2012-02-06 09:14:06

回答

2

可以隐含创建表变量指标作为唯一约束的一部分。

下面将创建与其他答案中完全相同的索引(除了将CI声明为唯一的,其中省略)。尽管UNIQUE(fundid, startdate,id)看起来好像在该答案的第二个索引中包含了一个额外的键列,但它将隐式包含在那里,因为聚簇索引键包含在所有非唯一非聚簇索引的键级别上。

DECLARE @SearchReviseBudget TABLE(   
    id     INT IDENTITY(1, 1) PRIMARY KEY,   
    fundid    BIGINT,   
    programid   BIGINT ,   
    projectid   BIGINT,   
    applicationnumber VARCHAR(50),   
    applicationname VARCHAR(100),   
    startdate   DATETIME,   
    enddate   DATETIME,   
    programtypeidfkid VARCHAR(50),   
    applicationbudget MONEY,   
    utlized   MONEY ,  
    [Left]    MONEY,   
    companyname  VARCHAR(100),   
    multiyearbudgetid BIGINT,   
    totalprogrambudget MONEY , 
    UNIQUE(fundid, startdate,id) 
    ) 

这就是说表变量没有维持他们比总行数等统计数据(以及你需要使用OPTION (RECOMPILE)为使用),所以#temp表往往是一个更好的选择呢。

+0

非常感谢你......它的工作...... :) – Prakash 2012-02-06 11:51:01