使用T-SQL从XML检索值

时间:2012-08-28 14:11:25

标签: sql-server xml tsql xquery

有人可以帮助我使用T-SQL和XQuery从附加的XML文件中检索值<QuoteId>吗?

我正在尝试使用此T-SQL但没有运气

declare @QuoteResponse XML
select @QuoteResponse =gQuoteResponse FROM AutoRenew where policyid= '454544'

SELECT b.value('(OverallResultStatus)[1]', 'varchar(100)')  as status
FROM
@QuoteResponse.nodes('GetQuoteResponse/OperationResult') as a(b) 

这是我用来检索QuoteId

DECLARE @QuoteResponse XML

SELECT @QuoteResponse = gQuoteResponse FROM [dbo].[AutoRenew] WHERE policyid = '454544'

SELECT
    @QuoteResponse.value('(GetQuoteResponse/QuoteResults/QuoteResult/QuoteId)[1]', 'bigint')

由于

<GetQuoteResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <OperationResult>
    <OverallResultStatus>xxxx</OverallResultStatus>
    <Results>
      <Result>
        <ResultStatus>xxxx</ResultStatus>
        <ResultCode>ddf</ResultCode>
        <ResultMessage>xxxxx</ResultMessage>
      </Result>
    </Results>
  </OperationResult>
  <QuoteResults>
    <QuoteResult>
      <OperationResult>
        <OverallResultStatus>xxx</OverallResultStatus>
        <Results>
          <Result>
            <ResultStatus>xx</ResultStatus>
            <ResultCode>xxxx</ResultCode>
            <ResultMessage>xx</ResultMessage>
          </Result>
        </Results>
      </OperationResult>
      <MainData>
        <StartDate>2012-08-14T00:00:00</StartDate>
        <ReturnDate>2013-08-13T00:00:00</ReturnDate>
        <TripType>xxx</TripType>
        <Area>xxx</Area>
        <Relationship>Individual</Relationship>
        <Product>
          <ProductId>xxx</ProductId>
          <Name>xxxx</Name>
        </Product>
        <Endorsements>
          <Endorsement>
            <EndorsementCode>xx</EndorsementCode>
            <Selected>xx</Selected>
            <Name>xxx</Name>
          </Endorsement>
          <Endorsement>
            <EndorsementCode>xxx</EndorsementCode>
            <Selected>xxx</Selected>
            <Name>xxxx</Name>
          </Endorsement>
        </Endorsements>
        <Promotion>
          <PromotionCode />
        </Promotion>
        <Travellers>
          <Traveller requestedMedicalScreening="false">
            <TravellerId>xxxx</TravellerId>
            <Title>xxx</Title>
            <FirstName>xxx </FirstName>
            <LastName>xxxx</LastName>
            <Age>xxx</Age>
          </Traveller>
        </Travellers>
      </MainData>
      <Price>
        <NetToParentAgent>xxx</NetToParentAgent>
        <NetPrice>xxx</NetPrice>
        <Tax>edew</Tax>
        <GrossPriceWithAllSurchargesAndMedicalScreenings>103.02</GrossPriceWithAllSurchargesAndMedicalScreenings>
      </Price>
      <QuoteId>322423234</QuoteId>
      <QuoteExpiryDate>xxx</QuoteExpiryDate>
      <SummaryOfCover />
    </QuoteResult>
  </QuoteResults>
</GetQuoteResponse>

2 个答案:

答案 0 :(得分:2)

这个怎么样:

DECLARE @QuoteResponse XML
SELECT @QuoteResponse = gQuoteResponse FROM dbo.AutoRenew WHERE policyid = '454544'

SELECT
    @QuoteResponse.value('(/GetQuoteResponse/QuoteResults/QuoteResult/QuoteId)[1]', 'bigint')

您只需要遵循XML元素层次结构 - 直到您阅读所需的值:

<GetQuoteResponse     -- this one is relevant ....
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <OperationResult>  -- irrelvant - not in here.....
    ......
  </OperationResult>
  <QuoteResults>       -- this one is relevant ....
    <QuoteResult>      -- this one is relevant ....
      <OperationResult>  -- irrelvant - not in here..... 
        ....
      </OperationResult>
      <MainData>   -- irrelvant - not in here..... 
        ......
      </MainData>
      <Price>    -- irrelvant - not in here..... 
        ......
      </Price>
      <QuoteId>322423234</QuoteId>   -- here's our value !

答案 1 :(得分:0)

您是否尝试过创建临时表,然后使用openxml填充临时表?

DECLARE @QuoteResponse XML
SELECT @QuoteResponse =gQuoteResponse FROM AutoRenew where policyid= '454544'

DECLARE @idoc INT
EXEC sp_xml_preparedocument @idoc OUTPUT, @QuoteResponse

CREATE TABLE #QuoteIds(   
    [QuoteId] VARCHAR (10))

INSERT INTO #QuoteIds ([QuoteId])
    SELECT QuoteId
    FROM OPENXML(@idoc, '/QuoteResults/QuoteResult/QuoteId', 2) WITH #QuoteIds

DECLARE @quoteid VARCHAR (10)
SET @quoteid = (SELECT TOP 1 QuoteId FROM #QuoteIds)