2017-04-05 108 views
1

我有一个XML formatted like this查询XML在SQL Server

<Maximum.Edm.CodeIncludedInCalculation > 
    <CalculationsByProvince> 
    <Maximum.Edm.IncludedInByProvince Province="QC"> 
     <RevenueCodeCalculations CalculationListType="RevenueCode"> 
     <Maximum.Edm.CalculationIncluded Code="@Vacation" IsSelected="True" /> 
     <Maximum.Edm.CalculationIncluded Code="@RRQ" IsSelected="True" /> 
     <Maximum.Edm.CalculationIncluded Code="@EmploymentInsurance" IsSelected="True" /> 
     [...] 
     </RevenueCodeCalculations> 
     <TaxableBenefitCalculations CalculationListType="TaxableBenefits"> 
     <Maximum.Edm.CalculationIncluded Code="1" IsSelected="False" /> 
     <Maximum.Edm.CalculationIncluded Code="AV. VIE FE" IsSelected="True" /> 
     </TaxableBenefitCalculations> 
     <DeductionCodeCalculations CalculationListType="DeductionCode"> 
     <Maximum.Edm.CalculationIncluded Code="123" IsSelected="False" /> 
     <Maximum.Edm.CalculationIncluded Code="456" IsSelected="True" /> 
     <Maximum.Edm.CalculationIncluded Code="AC" IsSelected="False" /> 
     [...] 
     </DeductionCodeCalculations> 
    </Maximum.Edm.IncludedInByProvince> 
    <Maximum.Edm.IncludedInByProvince Province="ON"> 
     [...] 
    </Maximum.Edm.IncludedInByProvince> 
    </CalculationsByProvince> 
</Maximum.Edm.CodeIncludedInCalculation> 

我想创建一个简单的查询将返回各CalculationIncludedcodeIsSelected值。我的最终目标是创建一个存储过程,该存储过程将收到codeprovinceCalculationListType并返回IsSelected值。

我试图用从hereherehere的例子,但我不断收到null或空值。

查询我试着用的例子之一进行:

select * from 
    (select 
    pref.value('(text())[1]', 'varchar(32)') as RoleName 
    from 
     Payroll.RevenueCode CROSS APPLY 
IncludeInCalculation.nodes('/Maximum.Edm.CodeIncludedInCalculation/CalculationsByProvince/Maximum.Edm.IncludedInByProvince/RevenueCodeCalculations') AS IncludeInCalculation(pref) 
) as Result 

回答

2

我的最终目标是创建一个将获得一个代码,一个省,一个CalculationListType并返回IsSelected值的存储过程。

这不应该需要一个存储过程...

下面将返回1(= true)或0(= FALSE)或NULL(=不存在)

DECLARE @Province NVARCHAR(100)='QC'; 
DECLARE @ListType NVARCHAR(100)='RevenueCode'; 
DECLARE @Code NVARCHAR(100)='@EmploymentInsurance' 

SELECT @xml.value(N'(/Maximum.Edm.CodeIncludedInCalculation 
        /CalculationsByProvince 
        /Maximum.Edm.IncludedInByProvince[@Province=sql:variable("@Province")] 
        /RevenueCodeCalculations[@CalculationListType=sql:variable("@ListType")] 
        /Maximum.Edm.CalculationIncluded[@Code=sql:variable("@Code")]/@IsSelected)[1]',N'bit') 
+0

该作品顶尖 !!非常感谢 –

+0

男孩我误解了问题+1 –