ストアドプロシージャで作成されたテーブルのインデックスを追加する

私は、以下に示す表のためのクラスタード・インデックスと非クラスタード・インデックスを作成する必要があります。一時的なテーブルのインデックスを作成しようとすると、正常に動作します。このテーブルのインデックスを作成しようとすると、構文エラーが発生します。

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         
2
そのMS SQLServerですか?そして何が間違っていますか?
追加された 著者 Mat,

1 答え

ユニーク制約の一部としてテーブル変数にインデックスを暗黙的に作成できます。

以下は、他のアンサーと全く同じインデックスを作成します(ただし、CIはそこで省略されたユニークとして宣言されます)。 UNIQUE(fundid、startdate、id)には、その回答の2番目のインデックスにはない追加のキー列が含まれているように見えますが、クラスタードインデックスキーが含まれているため暗黙的にそこに含まれますすべての一意でない非クラスター化インデックスのキーレベル

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 テーブルはとにかくより良い選択であることが多い。

2
追加された
とても大変ありがとうございました...それは働きました... :)
追加された 著者 Prakash,