0

テーブルに nvarchar(max) であり、XML ドキュメントを含むフィールドがあります。なぜ XML ではなく nvarchar(max) なのか、私にはわからないので聞かないでください。ところで、サンプル XML の抜粋を次に示します。

<?xml version="1.0" encoding="utf-16"?>
<ItemType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <AutoPay xmlns="urn:ebay:apis:eBLBaseComponents">true</AutoPay>
  <Country xmlns="urn:ebay:apis:eBLBaseComponents">IT</Country>
  <Currency xmlns="urn:ebay:apis:eBLBaseComponents">EUR</Currency>
  <HitCounter xmlns="urn:ebay:apis:eBLBaseComponents">BasicStyle</HitCounter>
  <ListingDuration xmlns="urn:ebay:apis:eBLBaseComponents">GTC</ListingDuration>
  <ListingType xmlns="urn:ebay:apis:eBLBaseComponents">FixedPriceItem</ListingType>
  <Location xmlns="urn:ebay:apis:eBLBaseComponents">Italy</Location>
  <PaymentMethods xmlns="urn:ebay:apis:eBLBaseComponents">PayPal</PaymentMethods>
  <PayPalEmailAddress xmlns="urn:ebay:apis:eBLBaseComponents">email@paypal.com</PayPalEmailAddress>
  <PrimaryCategory xmlns="urn:ebay:apis:eBLBaseComponents">
    <CategoryID>137084</CategoryID>
  </PrimaryCategory>
  <ShippingDetails xmlns="urn:ebay:apis:eBLBaseComponents">
    <ShippingServiceOptions>
      <ShippingService>StandardShippingFromOutsideUS</ShippingService>
      <ShippingServiceCost currencyID="EUR">0</ShippingServiceCost>
      <ShippingServiceAdditionalCost currencyID="EUR">0</ShippingServiceAdditionalCost>
      <FreeShipping>true</FreeShipping>
    </ShippingServiceOptions>
    <InternationalShippingServiceOption>
      <ShippingService>StandardInternational</ShippingService>
      <ShippingServiceCost currencyID="EUR">0</ShippingServiceCost>
      <ShippingServiceAdditionalCost currencyID="EUR">0</ShippingServiceAdditionalCost>
      <ShippingServicePriority>1</ShippingServicePriority>
      <ShipToLocation>Americas</ShipToLocation>
      <ShipToLocation>Europe</ShipToLocation>
    </InternationalShippingServiceOption>
    <ShippingType>Flat</ShippingType>
    <InsuranceDetails>
      <InsuranceFee currencyID="EUR">0</InsuranceFee>
      <InsuranceOption>NotOffered</InsuranceOption>
    </InsuranceDetails>
    <InternationalInsuranceDetails>
      <InsuranceFee currencyID="EUR">0</InsuranceFee>
      <InsuranceOption>NotOffered</InsuranceOption>
    </InternationalInsuranceDetails>
  </ShippingDetails>
  <Site xmlns="urn:ebay:apis:eBLBaseComponents">US</Site>
  <Storefront xmlns="urn:ebay:apis:eBLBaseComponents">
    <StoreCategoryID>2947535016</StoreCategoryID>
    <StoreCategory2ID>0</StoreCategory2ID>
  </Storefront>
  <DispatchTimeMax xmlns="urn:ebay:apis:eBLBaseComponents">4</DispatchTimeMax>
  <ReturnPolicy xmlns="urn:ebay:apis:eBLBaseComponents">
    <ReturnsAcceptedOption>ReturnsAccepted</ReturnsAcceptedOption>
    <Description>Accepted</Description>
    <ShippingCostPaidByOption>Buyer</ShippingCostPaidByOption>
  </ReturnPolicy>
  <ConditionID xmlns="urn:ebay:apis:eBLBaseComponents">1000</ConditionID>
</ItemType>

たとえば、CategoryID フィールドを抽出するために、そのフィールドのテーブルをクエリしたいと思います。ntext へのキャスト、utf-16 の削除、utf-8 への置き換え、名前空間の追加など、私が知っていることはすべて試しましたが、結果は常に NULL レコードです。

これが私が試したクエリの1つです:

;WITH XMLNAMESPACES('urn:ebay:apis:eBLBaseComponents' AS ns, 
'http://www.w3.org/2001/XMLSchema-instance' as xsi, 
'http://www.w3.org/2001/XMLSchema' as xsd)
select CategoryVal = CONVERT(xml, [Template]).value('(/ItemType/PrimaryCategory/CategoryID)[1]', 'nvarchar(max)') FROM Templates where ID = 1

ありがとう、マルコ

4

2 に答える 2

0

私は一度それをしましたが、名前空間を使用しませんでした。

入力は varchar(max) でした (nvarchar も機能するはずです)

@Text AS varchar(MAX)

次に、XML 型変数を使用すると、変換は次のように簡単になりました。

DECLARE @XML XML
SELECT @XML = @Text

CategoryID 値をクエリするには、次を使用します。

SELECT itemtype.item.value('(/ItemType/PrimaryCategory/CategoryID)[1]', 'nvarchar(max)')    
FROM @XML.nodes('/ItemType') AS itemtype(item);
于 2013-09-18T09:51:02.263 に答える