表变量的SQL SERVER NON-Clustered Index?

时间:2011-01-10 09:19:38

标签: sql-server-2005

我们如何在表变量上创建非聚集索引?

创建表@risk (rskid int)

在@risk(rskid)上创建非聚集索引r_rskid_nc

它不起作用??


我的推荐

如何优化呢?

ALTER PROCEDURE [dbo]。[SPR_LV004]    (     @TopN INT    ,@ LoggedUserId INT    ,@ Entity VARCHAR(255)    ,@ OpModel VARCHAR(255)    ,@ RiskCat VARCHAR(255)    ,@ RsdlInh VARCHAR(1)    ,@ DisplayAction VARCHAR(1)    ,@ LastAssDate DATETIME    ) AS

  SET NOCOUNT ON

DECLARE @Thisdate DATETIME

SET @ThisDate = GETDATE()

DECLARE @MainFilter  TABLE(
            fcaName VARCHAR(100)
           ,fctName VARCHAR(100)
           ,rskId INT PRIMARY KEY CLUSTERED )

DECLARE @Tgt  TABLE(rasRiskId INT
           ,rasId INT
           ,RAMName VARCHAR(100)
           ,RAMColour INT
           ,RAMImpDesc VARCHAR(100)
           ,RAMLikDesc VARCHAR(100)
           ,RAMImpScore INT
           ,RAMLikScore INT
            ,LastScore INT
            ,AnnualExposure NUMERIC(15, 0)
            ,Currency VARCHAR(9)
            ,OverallExp NUMERIC(15,0)
            ,Frequency INT
            ,LastAssessmentDate DATETIME)

DECLARE @Inh  TABLE(rasRiskId INT
           ,rasId INT
           ,RAMName VARCHAR(100)
           ,RAMColour INT
           ,RAMImpDesc VARCHAR(100)
           ,RAMLikDesc VARCHAR(100)
           ,RAMImpScore INT
           ,RAMLikScore INT
            ,LastScore INT
            ,AnnualExposure NUMERIC(15, 0)
            ,Currency VARCHAR(9)
            ,OverallExp NUMERIC(15,0)
            ,Frequency INT
            ,LastAssessmentDate DATETIME)

DECLARE @Res  TABLE(rasRiskId INT
            ,rasId INT
            ,RAMName VARCHAR(100)
            ,RAMColour INT
            ,RAMimpDesc VARCHAR(100)
            ,RAMlikDesc VARCHAR(100)
            ,RAMImpScore INT
            ,RAMLikScore INT
            ,LastScore INT
            ,AnnualExposure NUMERIC(15, 0)
            ,Currency VARCHAR(9)
            ,OverallExp NUMERIC(15,0)
            ,Frequency INT
            ,LastAssessmentDate DATETIME)

DECLARE @RiskData  TABLE(RAMScore INT
           ,AnnExp NUMERIC(15, 0)
           ,rskId INT
           ,RiskID VARCHAR(20)
           ,rskDescription VARCHAR(150)
           ,LongDesc VARCHAR(4000)
           ,RiskAssessmentDate VARCHAR(100)
           ,RAMName VARCHAR(100)
           ,rskRAMId INT
           ,rskRiskProfile INT
           ,EntityInfo VARCHAR(100)
           ,OwnerName VARCHAR(100)
           ,NomineeName VARCHAR(100)
           ,ReviewerName VARCHAR(100)
            ,TgtRasId INT
           ,TgtRamName VARCHAR(100)
           ,TgtRamColour INT
           ,TgtRamImpDesc VARCHAR(100)
           ,TgtRamLikDesc VARCHAR(100)
           ,TgtRamImpScore INT
           ,TgtRamLikScore INT
           ,TgtLastScore INT
           ,TgtAnnualExp Numeric(15,0)
           ,TgtCurrency VARCHAR(9)
           ,InhRasId INT
           ,InhRamName VARCHAR(100)
           ,InhRamColour INT
           ,InhRamImpDesc VARCHAR(100)
           ,InhRamLikDesc VARCHAR(100)
           ,InhRamImpScore INT
           ,InhRamLikScore INT
           ,InhLastScore INT
           ,InhAnnualExp Numeric(15,0)
           ,InhCurrency VARCHAR(9)
           ,RsdRasId INT
           ,RsdRamName VARCHAR(100)
           ,RsdRamColour INT
           ,RsdRamImpDesc VARCHAR(100)
           ,RsdRamLikDesc VARCHAR(100)
           ,RsdRamImpScore INT
           ,RsdRamLikScore INT
           ,RsdLastScore INT
           ,rsdAnnualExp Numeric(15,0)
           ,RsdCurrency VARCHAR(9)
           ,fcaName VARCHAR(100)
           ,fctName VARCHAR(100)
           ,CCRId VARCHAR(15)
           ,crrDescription VARCHAR(150)
           ,Assessed char(1)
           ,Attested Char(1)
           ,DisplayAction VARCHAR(1)               
           ,opModelName VARCHAR(255)
           ,severity NUMERIC(15,0)
           ,topriskcat VARCHAR(100)
           ,TgtOverallExp NUMERIC(15,0)
           ,TgtFrequency INT
           ,InhOverallExp NUMERIC(15,0)
           ,InhFrequency INT
           ,ResOverallExp NUMERIC(15,0)
           ,ResFrequency INT)

    DECLARE @RiskCtrl  TABLE(
            rcnRiskId INT
            ,rcnId INT
            ,ControlInfo VARCHAR(1100) 
            ,Performance INT --VARCHAR(60)              ,Design INT --VARCHAR(60)
            ,ControlOwner VARCHAR(100)
            ,ControlNominee VARCHAR(100)
            ,ControlReviewer VARCHAR(100))

    DECLARE  @ACTIONS  TABLE(
            ActionRiskId INT
           ,ControlID INT
           ,actTgtCompleteDate VARCHAR(9)
           ,actTgtODueDate VARCHAR(9)
           ,RATgtDate VARCHAR(9)
           ,ActNominee VARCHAR(100)             
           ,ActOwner VARCHAR(100)      
           ,ActCompleteAmt INT              
           ,ActionDetail VARCHAR(MAX)
           ,AType INT
           ,ActionState VARCHAR(90) )

    DECLARE  @TopRiskSort  TABLE(
            RdRecId INT IDENTITY(1,1) NOT NULL
            ,AnnExp NUMERIC(15, 0)
            ,rskId INT
            ,severity NUMERIC(15,0)
            )


    DECLARE  @TopRisk  TABLE(
            AnnExp NUMERIC(15, 0)
            ,rskId INT
            ,severity NUMERIC(15,0)
            )

   -- New tables for LV004 06-JAN-2010
   -- gets the parent Operational Model -- by priyanka 
    DECLARE @OpModels TABLE(
            OpModelName VARCHAR(255),
            rskId INT)

    DECLARE @TopRiskCat TABLE(
        rskid INT PRIMARY KEY CLUSTERED,
        topRiskCat VARCHAR(1000))

    --LOCAL VARIABLES 
    DECLARE @Query VARCHAR(8000)

    --Create filter data in a Table datatype
    INSERT INTO @MainFilter
    SELECT DISTINCT
            NULL as fcaName
           ,NULL as fctName
           ,R.rskId               
    FROM     RiskProfiles RP
    INNER JOIN RiskProfileFactAnal RPF
    ON       RP.rwkReference = RPF.wfaRiskProfile
    INNER JOIN FactCatAnal FA
    ON       RPF.wfaFactAnalId = FA.fcaId
    INNER JOIN UserViewsEntity UE
    ON       RPF.wfaRiskProfile = UE.uveEntId
    INNER JOIN Risks R
    ON       RP.rwkReference = R.rskRiskProfile
    INNER JOIN RiskAnalysis RA
    ON       R.rskId = RA.ranRiskId
    INNER JOIN RiskCategory RC
    ON       RA.ranRiskAnalId = RC.rctId
    LEFT OUTER JOIN RiskAssessment RASS
    ON       R.rskId = RASS.rasRiskId      
            AND R.rskRelevant = 'Y'
    WHERE    (UE.uveUserId = @LoggedUserId)                     
            --AND FA.fcaId in (SELECT FinalID FROM @FinalTree)
            AND FA.fcaId in (SELECT TreeTableID FROM [dbo].[OpModelListToTable](@OpModel))              AND RP.rwkReference in (SELECT TreeTableID FROM [dbo].[EntityListToTable](@Entity))
            AND RC.rctid in (SELECT TreeTableID FROM [dbo].[RiskCategoryListToTable](@RiskCat))
            AND R.rskOpendate <= @LastAssDate
  -- Insertion into new tables
   INSERT INTO @OpModels 
     SELECT  FCA.fcaName AS TopLevelBusinessLine,
                    Rsk.rskid
     FROM @MainFilter MF 
             INNER JOIN Risks RSK 
                    ON  RSK.rskid= MF.rskId   
             INNER JOIN  RiskProfileFactAnal RPF
                    ON RPF.wfaRISkProfile = RSK.rskRiskProfile
             INNER JOIN FactCatAnal FCA 
                    ON FCA.fcaId = RPF.wfaFactAnalId 
             INNER JOIN FactCategory  FC
                    ON FC.fctid = FCA.fcaCategory and FC.fctName='Business Unit'                                

  INSERT INTO @TopRiskCat
        SELECT R.rskid
              ,dbo.fn_GetTopParentRiskCategoryScalar(RC.rctId) as TopLevelRiskCat
        FROM @MainFilter MF 
        INNER JOIN  RISKS R 
            ON  R.rskid= MF.rskId   
        INNER JOIN RiskAnalysis RA
            ON R.rskId = RA.ranRiskId
        INNER JOIN RiskCategory as RC
            ON RA.ranRiskAnalId = RC.rctId


    -- Target Data
    INSERT   INTO @Tgt
    SELECT TgtRskID,rasId,ramaltName,ramaltColour,TgtRAMDescr,TgtRAMLikDescr,TgtRAMImpScr,TgtRAMLikScr
,LastScore  , AnnualExposure,curCode, TgtOverallExp,TgtFrequency,RiskLastAssessment FROM (
    SELECT 
          RA.rasRiskId AS TgtRskID
         ,RA.rasId 
         ,RM.ramaltName
         ,RM.ramaltColour 
         ,isnull(RI.ramimpDescription,'') AS TgtRAMDescr
         ,isnull(RL.ramlikDescription,'') AS TgtRAMLikDescr
         ,isnull(RA.rasRAMImpactScore,0)  AS TgtRAMImpScr
         ,isnull(RA.rasRAMLikelihoodScore,0) AS TgtRAMLikScr
         ,isnull(dbo.RiskAssessmentLastScore(RA.rasRiskId, 'I'),0) AS LastScore
        ,ISNULL(RA.rasExposureHO * (RA.rasRAMLikFreqEntered / 100), 0) / 1000 AS AnnualExposure
        ,RCU.curCode 
        ,RA.rasExposure as TgtOverallExp
        ,RA.rasRAMLikFreqEntered as TgtFrequency
        ,RA.rasAssessmentDate as RiskLastAssessment         
    FROM     RAMImpacts RI
    INNER JOIN RiskAssessment RA
    ON       RI.ramimpScore = RA.rasRAMImpactScore
          AND RI.ramimpRAMId = RA.rasRAMId
    INNER JOIN Risks R
    ON       R.rskId = RA.rasRiskId
    INNER JOIN @MainFilter MF
    ON       MF.rskId = R.rskId
    INNER JOIN RAMALTs RM
    ON       RA.rasRAMId = RM.ramaltRAMId
          AND RA.rasRAMALTAmount = RM.ramaltAmount
    INNER JOIN RAMLikelihoods RL
    ON       RA.rasRAMLikelihoodScore = RL.ramlikScore
          AND RA.rasRAMId = RL.ramlikRAMId
    LEFT OUTER JOIN RAM RMS 
    ON      RA.rasRAMId = RMS.ramId 
    LEFT OUTER JOIN Currencies RCU 
    ON      RMS.ramCurrencyId = RCU.curId
    WHERE    (RA.rasType = 'T') )
    A --WHERE A.RiskLastAssessment IN 
        INNER  JOIN (SELECT MAX(RAouter.rasAssessmentDate)as rasAssessmentDate,RAouter.rasRiskid FROM  RiskAssessment RAouter 
            --WHERE RAouter.rasAssessmentDate <= @LastAssDate 
                Group by RAouter.rasRiskid) B 
    ON A.RiskLastAssessment = B.rasAssessmentDate and A.TgtRskID = B.rasRiskid


    --Inherent data
    INSERT INTO @Inh

    SELECT InhRskID,rasId,ramaltName,ramaltColour,InhRAMDescr,InhRAMLikDescr,InhRAMImpScr,InhRAMLikScr,LastScore,AnnualExposure,curCode,
            InhOverallExp,InhFrequency,RiskLastAssessment FROM (
    SELECT RA.rasRiskId AS InhRskID
         ,RA.rasId
         ,RM.ramaltName
         ,RM.ramaltColour
         ,isnull(RI.ramimpDescription,'') AS InhRAMDescr
         ,isnull(RL.ramlikDescription,'') AS InhRAMLikDescr
         ,isnull(RA.rasRAMImpactScore,0)  AS InhRAMImpScr
         ,isnull(RA.rasRAMLikelihoodScore,0) AS InhRAMLikScr
         ,isnull(dbo.RiskAssessmentLastScore(RA.rasRiskId, 'I'),0) AS LastScore
        ,ISNULL(RA.rasExposureHO * (RA.rasRAMLikFreqEntered / 100), 0) / 1000 AS AnnualExposure
        ,RCU.curCode
        ,RA.rasExposure as InhOverallExp
        ,RA.rasRAMLikFreqEntered as InhFrequency 
        ,RA.rasAssessmentDate as RiskLastAssessment
    FROM     RAMImpacts RI
    INNER JOIN RiskAssessment RA
    ON       RI.ramimpScore = RA.rasRAMImpactScore
          AND RI.ramimpRAMId = RA.rasRAMId
    INNER JOIN Risks R
    ON       R.rskId = RA.rasRiskId
    INNER JOIN @MainFilter MF
    ON       MF.rskId = R.rskId
    INNER JOIN RAMALTs RM
    ON       RA.rasRAMId = RM.ramaltRAMId
          AND RA.rasRAMALTAmount = RM.ramaltAmount
    INNER JOIN RAMLikelihoods RL
    ON       RA.rasRAMLikelihoodScore = RL.ramlikScore
          AND RA.rasRAMId = RL.ramlikRAMId
    LEFT OUTER JOIN RAM RMS 
    ON      RA.rasRAMId = RMS.ramId 
    LEFT OUTER JOIN Currencies RCU 
    ON      RMS.ramCurrencyId = RCU.curId
    WHERE    (RA.rasType = 'I'))--          AND (RA.rasIsLatest = 'Y')
    A --WHERE A.RiskLastAssessment IN 
        INNER  JOIN (SELECT MAX(RAouter.rasAssessmentDate)as rasAssessmentDate,RAouter.rasRiskid FROM  RiskAssessment RAouter 
            --WHERE RAouter.rasAssessmentDate <= @LastAssDate 
                Group by RAouter.rasRiskid) B 
    ON A.RiskLastAssessment = B.rasAssessmentDate and A.InhRskID = B.rasRiskid


    --Residual data
    INSERT   INTO @Res
    SELECT ResRskID,rasId,ramaltName,ramaltColour,ResRAMDescr,ResRAMLikDescr,ResRAMImpScr,ResRAMLikScr,LastScore,AnnualExposure,curCode,
            ResOverallExp,ResFrequency,RiskLastAssessment  FROM(
    SELECT   RA.rasRiskId AS ResRskID
         ,RA.rasId
         ,RM.ramaltName
         ,RM.ramaltColour
         ,isnull(RI.ramimpDescription,'') AS ResRAMDescr
         ,isnull(RL.ramlikDescription,'') AS ResRAMLikDescr
         ,isnull(RA.rasRAMImpactScore,0)  AS ResRAMImpScr
         ,isnull(RA.rasRAMLikelihoodScore,0) AS ResRAMLikScr
         ,isnull(dbo.RiskAssessmentLastScore(RA.rasRiskId, 'R'),0) AS LastScore
        ,ISNULL(RA.rasExposureHO * (RA.rasRAMLikFreqEntered / 100), 0) / 1000 AS AnnualExposure
        ,RCU.curCode 
        ,RA.rasExposure as ResOverallExp
        ,RA.rasRAMLikFreqEntered as ResFrequency
        ,RA.rasAssessmentDate as RiskLastAssessment

    FROM     RAMImpacts RI
    INNER JOIN RiskAssessment RA
    ON       RI.ramimpScore = RA.rasRAMImpactScore
          AND RI.ramimpRAMId = RA.rasRAMId
    INNER JOIN Risks R
    ON       R.rskId = RA.rasRiskId
    INNER JOIN @MainFilter MF
    ON       MF.rskId = R.rskId
    INNER JOIN RAMALTs RM
    ON       RA.rasRAMId = RM.ramaltRAMId
          AND RA.rasRAMALTAmount = RM.ramaltAmount
    INNER JOIN RAMLikelihoods RL
    ON       RA.rasRAMLikelihoodScore = RL.ramlikScore
          AND RA.rasRAMId = RL.ramlikRAMId
    LEFT OUTER JOIN RAM RMS 
    ON      RA.rasRAMId = RMS.ramId 
    LEFT OUTER JOIN Currencies RCU 
    ON      RMS.ramCurrencyId = RCU.curId
    WHERE    (RA.rasType = 'R'))--  AND (RA.rasIsLatest = 'Y')
     A --WHERE A.RiskLastAssessment IN 
        INNER  JOIN (SELECT MAX(RAouter.rasAssessmentDate)as rasAssessmentDate,RAouter.rasRiskid FROM  RiskAssessment RAouter 
            --WHERE RAouter.rasAssessmentDate <= @LastAssDate 
                Group by RAouter.rasRiskid) B 
    ON A.RiskLastAssessment = B.rasAssessmentDate and A.ResRskID = B.rasRiskid  

    -- Risk Data to display on report   
    INSERT   INTO @RiskData
    SELECT   RA.rasRAMImpactScore * RA.rasRAMLikelihoodScore AS RAMScore
        ,ISNULL(RA.rasExposureHO * (RA.rasRAMLikFreqEntered / 100), 0) / 1000 AS AnnExp -- Required for sorting.
        ,RSK.rskId
        ,dbo.RiskPrefixId(RSK.rskId) AS RiskID
        ,isnull(RSK.rskDescription,'')
        ,isnull(SUBSTRING(RSK.rskLongDesc, 1, 4000),'') AS LongDesc
        ,CASE WHEN YEAR(RSK.rskAssNext) <= 1900
            THEN NULL 
            ELSE CONVERT(VARCHAR(9), RSK.rskAssNext, 6) 
         END as RiskAssessmentDate
        ,RAM.RAMName
        ,RSK.rskRAMId
        ,RSK.rskRiskProfile
        ,RP.rwkDesc + ': ' + dbo.EntityPrefixId(RSK.rskRiskProfile) AS EntityInfo
        ,isnull(dbo.FULLNAME(RSK.rskOwner),'...') AS OwnerName
        ,isnull(dbo.FULLNAME(RSK.rskNomineeId),'...') AS NomineeName
        ,isnull(dbo.FULLNAME(RSK.rskReviewer),'...') AS ReviewerName
        ,T.rasId AS TgtRasId
        ,T.RAMName AS TgtRamName
        ,T.RAMColour AS  TgtRamColour
        ,T.RAMImpDesc AS TgtRamImpDesc
        ,T.RAMLikDesc AS TgtRamLikDesc
        ,isnull(T.RAMImpScore,0) AS TgtRamImpScore
        ,isnull(T.RAMLikScore,0) AS TgtRamLikScore
        ,isnull(T.LastScore,0) AS TgtLastScore      
        ,isnull(T.AnnualExposure,0.00) AS TgtAnnualExp
        ,T.Currency as TgtCurrency
        ,I.rasId AS InhRasId
        ,I.RAMName AS InhRamName
        ,I.RAMColour AS InhRamColour
        ,I.RAMImpDesc AS InhRamImpDesc
        ,I.RAMLikDesc AS InhRamLikDesc
        ,isnull(I.RAMImpScore,0) AS InhRamImpScore
        ,isnull(I.RAMLikScore,0) AS InhRamLikScore
        ,isnull(I.LastScore,0) AS InhLastScore
        ,isnull(I.AnnualExposure,0.00) AS InhAnnualExp
        ,I.Currency as InhCurrency
        ,R.rasId AS RsdRasId
        ,R.RAMName AS RsdRamName
        ,R.RAMColour AS RsdRamColour
        ,R.RAMimpDesc AS RsdRamImpDesc
        ,R.RAMlikDesc AS RsdRamLikDesc
        ,isnull(R.RAMImpScore,0) AS RsdRamImpScore
        ,isnull(R.RAMLikScore,0) AS RsdRamLikScore
        ,isnull(R.LastScore,0) AS RsdLastScore
        ,isnull(R.AnnualExposure,0.00) AS RsdAnnualExp
        ,R.Currency as RsdCurrency
        ,MF.fcaName
        ,MF.fctName
        ,dbo.CRRPrefixId(CRR.CrrId) AS CCRId
        ,isnull(CRR.crrDescription,'') 
        ,CASE WHEN ISNULL(RA.rasid,0) = 0 THEN 'N' Else 'Y' END AS Assessed 
        ,CASE WHEN UPPER((RA.rasstatus)) = 'A' THEN 'Y' ELSE 'N' END AS Attested    
        ,@DisplayAction         
        ,OP.OpModelName as TopLevelOpModel
        ,RSK.rskSeverity as RiskSeverity
        ,TRC.topRiskCat as TopLevelRiskCat
        ,Isnull(T.OverallExp/1000,0) as TgtOverallExp
        ,Isnull(T.Frequency,0) as TgtFrequency
        ,IsNUll(I.OverallExp/1000,0) as InhOverallExp
        ,ISNUll(I.Frequency,0) as InhFrequency 
        ,IsNUll(R.OverallExp/1000,0) as ResOverallExp
        ,Isnull(R.Frequency,0) as ResFrequency              
    FROM     Risks RSK
    INNER JOIN @MainFilter MF
    ON       MF.rskId = RSK.rskId
    INNER JOIN RiskProfiles RP
    ON       RSK.rskRiskProfile = RP.rwkReference
    INNER JOIN RAM
    ON       RP.rwkRAMID = RAM.ramId
    LEFT OUTER JOIN CentralRiskRegister CRR
    ON       CRR.crrId = RSK.rskCRRId   -- Added on 03/Jan/08
    LEFT OUTER JOIN RiskAssessment RA
    ON       RSK.rskId = RA.rasRiskId
     AND RA.rasIsLatest = 'Y'
      AND RA.rasType = CASE WHEN @RsdlInh = '1'  THEN 'R'
                            WHEN @RsdlInh = '2'  THEN 'I'
                            ELSE 'T'
                       END
    LEFT OUTER JOIN @Tgt T
    ON       RSK.rskId = T.rasRiskId
    LEFT OUTER JOIN @Inh I
    ON       RSK.rskId = I.rasRiskId
    LEFT OUTER JOIN @Res R
    ON       RSK.rskId = R.rasRiskId
    LEFT OUTER JOIN @OpModels OP
    ON      RSK.rskId = OP.rskid
    LEFT OUTER JOIN @TopRiskCat TRC
    ON      RSk.rskid = TRC.rskid       
    WHERE    RSK.rskRelevant = 'Y'


-- Get Risk data in descending order of Severity
    INSERT INTO @TopRiskSort
    select distinct AnnExp,rskId,severity
    FROM @RiskData
    Order BY Severity desc;
    --Order BY AnnExp desc;

    --If @TopN values is 0 take all the recods
    IF @TopN = 0 
    BEGIN
        INSERT INTO @TopRisk
        select   AnnExp
                ,rskId
                ,severity
        from @TopRiskSort 
    END
    ELSE
    BEGIN   -- Else 
        INSERT INTO @TopRisk
        select   AnnExp
                ,rskId
                ,severity 
        from @TopRiskSort
        where RdRecId <= @topn;
    END


    --Controls for the above Risks
    INSERT INTO @RiskCtrl
    SELECT RD.rskId
        ,RC.rcnId
        ,dbo.RiskControlPrefixId(RC.rcnId) + ':' + rcnShortDescr AS ControlInfo
        ,(SELECT efid FROM Effectiveness WHERE efId = CA.rcaEffectiveness) AS Performance --ACCR-1327
        ,(SELECT adid FROM Adequacy WHERE adId = CA.rcaAdequacy) AS Design          ,dbo.FULLNAME(RC.rcnOwnerId) AS ControlOwner
        ,dbo.FULLNAME(RC.rcnNomineeId) AS ControlNominee
        ,dbo.FULLNAME(RC.rcnReviewerId) AS ControlReviewer
    FROM @TopRisk TR        
        LEFT OUTER JOIN @RiskData RD ON RD.rskId=TR.rskId
        LEFT OUTER JOIN RiskControls RC ON RC.rcnRiskId = RD.rskId
        LEFT OUTER JOIN RiskCtrlAss CA ON RC.rcnId = CA.rcaRiskCtrlId
    WHERE (ISNULL(CA.rcaId, 0) = (SELECT IsNull(MAX(RA.rcaId), 0) FROM RiskCtrlAss RA 
                                    WHERE RA.rcaRiskCtrlId = RC.rcnId))


    --Risk and Risk Controls Actions
    INSERT INTO @ACTIONS
    -- Risk Actions fro all the risks in @RiskData table
    SELECT A.actOwningId AS ActionRiskId
        ,NULL AS ControlID
        ,CASE WHEN (YEAR(A.actTargetDate) > 1900)
                AND (

                      A.actState = 4
                    )
           THEN CONVERT (VARCHAR(9), A.actTargetDate, 6)
           ELSE NULL
        END 
        AS actTgtCompleteDate
        ,CASE WHEN (YEAR(A.actTargetDate) > 1900)
                AND (A.actState < 3)
                AND (A.actTargetDate <= @ThisDate)
           THEN CONVERT (VARCHAR(9), A.actTargetDate, 6)
           ELSE NULL
        END AS actTgtODueDate
        ,CASE WHEN (YEAR(A.actTargetDate) > 1900)
                AND (A.actState < 3)
                AND (A.actTargetDate <= @ThisDate)
           THEN NULL --'overdue'
           WHEN YEAR(A.actTargetDate) > 1900
                AND (
                     A.actState = 3
                     OR A.actState = 4
                    ) THEN NULL --'complete'
           WHEN YEAR(A.actTargetDate) <= 1900
           THEN NULL
           ELSE CONVERT(VARCHAR(9), A.actTargetDate, 6)
        END AS RATgtDate
        ,dbo.FULLNAME(A.actNomineeId) AS ActNominee         
        ,dbo.FULLNAME(A.actOwnerId) AS ActOwner         
        ,A.actCompletionAmount AS CompletionAmount          
        ,isnull((CASE A.actOwningTableNum
        WHEN 2 THEN dbo.RiskControlPrefixId(A.actOwningId)+ '/' + dbo.ActionPrefixId(A.actId)+ ':' + Cast(actCommentary as Varchar(MAX))
        WHEN 3 THEN dbo.ActionPrefixId(A.actId) + ':' + Cast(actCommentary as Varchar(MAX)) END),'') AS ActionDetail
            ,actOwningTableNum AS AType
        ,dbo.[ActionStatusStr](A.actState)  
    FROM Actions A
        INNER JOIN @RiskData RD ON RD.rskId = A.actOwningId
        INNER JOIN @TopRisk TR ON TR.rskId = A.actOwningId
    WHERE    A.actOwningTableNum = 3
        AND (A.actState < 4) AND (A.actstate != 3)

    UNION

    -- Risk Control  Actions for all the risk controls in @RiskCtrl table
    SELECT   RC.rcnRiskId AS ActionRiskId
        ,RC.rcnId AS ControlID
        ,CASE WHEN (YEAR(A.actTargetDate) > 1900)
                AND (
                    -- A.actState > 2                        AND 
                        A.actState <= 4
                    )
           THEN CONVERT (VARCHAR(9), A.actTargetDate, 6)
           ELSE NULL
        END 
        AS actTgtCompleteDate
        ,CASE WHEN (YEAR(A.actTargetDate) > 1900)
                AND (A.actState < 3)
                AND (A.actTargetDate <= @ThisDate)
           THEN CONVERT (VARCHAR(9), A.actTargetDate, 6)
           ELSE NULL
        END AS actTgtCompleteDate
        ,CASE WHEN (YEAR(A.actTargetDate) > 1900)
                AND (A.actState < 3)
                AND (A.actTargetDate <= @ThisDate)
           THEN NULL --'overdue'
           WHEN YEAR(A.actTargetDate) > 1900
                AND (
                     A.actState = 3
                     OR A.actState = 4
                    ) THEN NULL --'compete'
           WHEN YEAR(A.actTargetDate) <= 1900
           THEN NULL
           ELSE CONVERT (VARCHAR(9), A.actTargetDate, 6)
        END AS RATgtDate
        ,dbo.FULLNAME(actNomineeId) AS ActNominee
        ,dbo.FULLNAME(actOwnerId) AS ActOwner           
        ,A.actCompletionAmount AS CompletionAmount
        ,CASE A.actOwningTableNum
        WHEN 2 THEN dbo.RiskControlPrefixId(A.actOwningId) + '/' + dbo.ActionPrefixId(A.actId) + ':' + Cast(actCommentary as Varchar(MAX))
                       WHEN 3 THEN dbo.ActionPrefixId(A.actId) + ':' + Cast(actCommentary as Varchar(MAX)) END AS ActionDetail
        -- A.actDescription END AS ActionDetail             ,actOwningTableNum AS AType
        ,dbo.[ActionStatusStr](A.actState)
    FROM     Actions A
        RIGHT OUTER JOIN RiskControls RC
        ON       A.actOwningId = RC.rcnId
        INNER JOIN @RiskCtrl TRC
        ON       TRC.rcnRiskId = RC.rcnRiskId
    WHERE    (A.actOwningTableNum = 2)
        AND (A.actState < 4) AND (A.actstate != 3)



    IF (@RsdlInh = '1') 
    BEGIN   
    SELECT   RD.* 
            ,NULL AS rcnId
            ,NULL AS ControlInfo
            ,NULL AS Performance
            ,NULL AS Design
            ,NULL AS ControlOwner
            ,NULL AS ControlNominee
            ,NULL AS ControlReviewer
            ,A.*                
    FROM     @RiskData RD
        INNER JOIN @TopRisk TR ON TR.rskId=RD.rskId
        LEFT OUTER JOIN @ACTIONS A
        ON       (
                  RD.rskid = A.ActionRiskId
                  AND A.AType = 3
                 )
            UNION
    SELECT   RD.*
            ,RC.rcnId
            ,RC.ControlInfo
            ,RC.Performance
            ,RC.Design
            ,RC.ControlOwner
            ,RC.ControlNominee
            ,RC.ControlReviewer
            ,A.*                
    FROM     @RiskData RD
    INNER JOIN @TopRisk TR ON TR.rskId=RD.rskId
    INNER JOIN @RiskCtrl RC ON RD.rskId = RC.rcnRiskId
    LEFT OUTER JOIN @ACTIONS A
    ON       (
              A.AType = 2
              AND RC.rcnId = A.ControlID
             )  
                ORDER BY RD.RsdAnnualExp DESC 
    END

    IF (@RsdlInh = '2') 
    BEGIN   
    SELECT   RD.* 
            ,NULL AS rcnId
            ,NULL AS ControlInfo
            ,NULL AS Performance
            ,NULL AS Design
            ,NULL AS ControlOwner
            ,NULL AS ControlNominee
            ,NULL AS ControlReviewer
            ,A.*                
    FROM     @RiskData RD
        INNER JOIN @TopRisk TR ON TR.rskId=RD.rskId
        LEFT OUTER JOIN @ACTIONS A
        ON       (
                  RD.rskid = A.ActionRiskId
                  AND A.AType = 3
                 )
            UNION
    SELECT   RD.*
            ,RC.rcnId
            ,RC.ControlInfo
            ,RC.Performance
            ,RC.Design
            ,RC.ControlOwner
            ,RC.ControlNominee
            ,RC.ControlReviewer
            ,A.*                
    FROM     @RiskData RD
    INNER JOIN @TopRisk TR ON TR.rskId=RD.rskId
    INNER JOIN @RiskCtrl RC ON RD.rskId = RC.rcnRiskId
    LEFT OUTER JOIN @ACTIONS A
    ON       (
              A.AType = 2
              AND RC.rcnId = A.ControlID
             )  
                ORDER BY RD.InhAnnualExp DESC 
    END

    IF (@RsdlInh = '3') 
    BEGIN   
    SELECT   RD.* 
            ,NULL AS rcnId
            ,NULL AS ControlInfo
            ,NULL AS Performance
            ,NULL AS Design
            ,NULL AS ControlOwner
            ,NULL AS ControlNominee
            ,NULL AS ControlReviewer
            ,A.*                
    FROM     @RiskData RD
        INNER JOIN @TopRisk TR ON TR.rskId=RD.rskId
        LEFT OUTER JOIN @ACTIONS A
        ON       (
                  RD.rskid = A.ActionRiskId
                  AND A.AType = 3
                 )
            UNION
    SELECT   RD.*
            ,RC.rcnId
            ,RC.ControlInfo
            ,RC.Performance
            ,RC.Design
            ,RC.ControlOwner
            ,RC.ControlNominee
            ,RC.ControlReviewer
            ,A.*                
    FROM     @RiskData RD
    INNER JOIN @TopRisk TR ON TR.rskId=RD.rskId
    INNER JOIN @RiskCtrl RC ON RD.rskId = RC.rcnRiskId
    LEFT OUTER JOIN @ACTIONS A
    ON       (
              A.AType = 2
              AND RC.rcnId = A.ControlID
             )  
                ORDER BY RD.RsdAnnualExp DESC 
    END

请帮助!!

提前致谢

5 个答案:

答案 0 :(得分:11)

嗯,对于Priyanka来说可能为时已晚,但是其他人可能会觉得这很有用。

有一种方法可以在临时表上创建一个非唯一索引,使用一个小技巧:添加一个标识列并将其作为主键的最后一个字段。

DECLARE @MyTable TABLE (IXField1 int, IXFiled2 int, Field3 bit, HelperIX int IDENTITY (1,1), PRIMARY KEY/UNIQUE (IXField1, IXField2, HelperIX)

答案 1 :(得分:2)

你不能像这样自由地在表变量上创建索引,但是你可以像这样创建一个PRIMARY KEY(注意你也可以使它成为一个非阻塞的PK):

DECLARE @risk TABLE (rskid int PRIMARY KEY)

当然,假设您将插入唯一值。

或者,您需要使用临时表。

答案 2 :(得分:2)

可以应用于表变量的唯一索引是PRIMARY KEY或UNIQUE约束后面的隐式索引。如果您想要索引的内容不是唯一的,则无法在表变量中对其进行索引。

如果它是唯一的,则必须在声明变量时指定约束:

declare @t table (
    ID int not null,
    Val1 varchar(10) not null,
    PRIMARY KEY NONCLUSTERED (ID),
    UNIQUE CLUSTERED (Val1)
)
insert into @t (ID,Val1)
select 1,'abc'

select * from @t

答案 3 :(得分:1)

我不知道您使用的是哪个版本,但我使用的是SQL Server 2016,它就像

一样简单
    declare @Stock table
    (
        StockId     int     NOT NULL
    ,   FieldId     int     NOT NULL
    ,   StockDate   date    NOT NULL
    ,   StockValue  float   NULL
    ,   INDEX IX_Priyanka NONCLUSTERED(StockId, FieldId, StockDate desc) 
    )        

希望它涵盖您正在寻找的某些方面。

答案 4 :(得分:0)

从 SQL Server 2014 开始,您可以在声明表变量的同时创建内联非聚集索引。

DECLARE @TabVar TABLE 
(
    ID INT PRIMARY KEY, 
    FNAME NVARCHAR(100) INDEX IX2 NONCLUSTERED
)

对于较早版本,索引将在约束后面创建,您可以创建唯一约束(如果要创建唯一约束的列不应该包含唯一约束,则在末尾包含标识列values) 会隐式地创建一个非聚集索引。