2017-08-16 69 views
-1

我有一个表Campaign与列CampaignXml加上其他列。在CampaignXml,我保存问题。我需要一个查询来获得所有CampaignXml列中的问题数量。我需要查询以获得有关XML的数据计数

我写了一个存储过程使用top 1 CampaignXMLCampaign表,但我想看看表中的所有CampaignXml并得到问题计数。

ALTER PROCEDURE [dbo].[GetPanelsitCount] 
AS 
    DECLARE @CampaignXML NVARCHAR(MAX) 
    DECLARE @idoc INT  

    DECLARE @Marketid INT 

    SELECT DISTINCT TOP 1 @CampaignXML = CampaignXML, @marketid = marketid   
    FROM dbo.Campaign   
    WHERE campaigntypeid = 8 
     AND CampaignXML IS NOT NULL 
     AND statusid = 57  
     AND marketid = 24 

    EXEC sp_xml_preparedocument @idoc OUTPUT   

    ,@CampaignXML 

    (SELECT ID INTO #tblQuestionId FROM OPENXML(@idoc, 'XmlCampiagn/Pages/Page[1]/Questions/Question') WITH (ID INT '@ID'))  
    -- select * from #tblQuestionId  

示例XML:

<XmlCampiagn Name='My Campaign' ID='4'> 
    <GlobalSetting Name='Global Setting'> 
     <MobileNumberVerification Enabled='False' Mandatory='False' Required='False'></MobileNumberVerification> 
     <XGEOTargeting Enabled='False'></XGEOTargeting> 
     <Captcha Enabled='False'></Captcha> 
    </GlobalSetting> 
    <Pages> 
     <Page ID= '1' Name='Default' PageType='Default' Mode='0'> 
      <PipingLogics></PipingLogics> 
      <Questions> 
       <Question MaxLength='' Validation='' ID='6448' 
          Mandatory='True' Required='False' IsNonEditable='False'/> 
      </Questions> 
      <Logics></Logics> 
      <Masking‌​Logics></MaskingLogi‌​cs> 
     </Page> 
    </Pages> 
</‌​XmlCampiagn> 

回答

1

您可以在SQL Server中自带XQuery支持这样做很容易 - 无需使用sp_xml_preparedocument或任何遗留类似的东西....

试试这个:

SELECT 
    CampaignId, 
    CAST(CampaignXml AS XML).value('count(//Question)', 'int') 
FROM 
    dbo.Campaign 
WHERE 
    CampaignTypeId = 8 
    AND CampaignXml IS NOT NULL 
    AND StatusId = 57  
    AND MarketId = 24 

这将为您提供CampaignId以及该活动的问题数(所有可能的多个<Page>子元素的所有问题)。如果您需要总的整体,使用此:

SELECT 
    SUM(CAST(CampaignXml AS XML).value('count(//Question)', 'int')) 
FROM 
    dbo.Campaign 
WHERE 
    CampaignTypeId = 8 
    AND CampaignXml IS NOT NULL 
    AND StatusId = 57  
    AND MarketId = 24 
+0

感谢,但我得到error..Cannot既找不到列“CampaignXML”或用户定义的函数或聚合“CampaignXML.value”,或名称不明确。 –

+0

@ M.Hasan:那么,**数据类型**是您的“CampaignXml”列?既然你说它存储XML,我认为它是'XML'数据类型 - 如果不是,那么'.value()'是不可能的,当然..... –

+0

它的nvarchar数据类型 –