2017-08-16 71 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數據類型 –