我们如何在表变量上创建非聚集索引?
创建表@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
请帮助!!
提前致谢
答案 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) 会隐式地创建一个非聚集索引。