2015-03-13 4 views
-1

У меня возникают проблемы с запросом на данные xml, хранящиеся в sql 2012 .. ниже дерево узлов я хочу извлечь значение «LicensingWindowStart».sql-запрос для извлечения данных из xml

<sol> 
    <so> 
     <v>0</v> 
     <t>BusinessMetadata</t> 
     <al> 
     <a k="Price"> 
      <v>4.99</v> 
     </a> 
     <a k="Currency"> 
      <v>US</v> 
     </a> 
     </al> 
     <sol /> 
    </so> 
    <so> 
     <v>0</v> 
     <t>RightsMetadata</t> 
     <al> 
     <a k="LicensingWindowStart"> 
      <v>2008-09-12T00:00:00</v> 
     </a> 
     <a k="LicensingWindowEnd"> 
      <v>2015-09-19T23:59:59</v> 
     </a> 
     <a k="AvailabilityWindowStart"> 
      <v>2008-09-12T00:00:00</v> 
     </a> 
     <a k="AvailabilityWindowEnd"> 
      <v>2015-09-19T23:59:59</v> 
     </a> 
     <a k="NewReleaseWindow"> 
      <v>0</v> 
     </a> 
     <a k="MaximumViewingLimit"> 
      <v>10080</v> 
     </a> 
     </al> 
     <sol /> 
    </so> 
    <so xsi:type="ListingsItem"> 
     <v>0</v> 
     <id>test/1080i25spts3NascarSchool3mints_feature</id> 
     <t>feature</t> 
     <n>Nascar_Racing_School_feature</n> 
     <fl> 
     <f>HD</f> 
     </fl> 
     <al> 
     <a k="AssetId"> 
      <v>1080i25spts3NascarSchool3mints_feature</v> 
     </a> 
     <a k="StreamFormat"> 
      <v>rtp</v> 
     </a> 
     <a k="RuntimeSeconds"> 
      <v>175</v> 
     </a> 
     <a k="DefaultLanguage"> 
      <v>en</v> 
     </a> 
     <a k="Content"> 
      <v t="FileName">1080i25-spts-3-NascarSchool-3min.ts</v> 
      <v t="SizeInBytes" /> 
      <v t="NetworkType" /> 
      <v t="KBPS" /> 
      <v t="PlayReady" /> 
      <v t="WebInitiatorUrl" /> 
      <v t="LicenseServerProxyUrl" /> 
      <v t="Type" /> 
      <v t="PitchedFilename">1080i25-spts-3-NascarSchool-3min.ts</v> 
     </a> 
     <a k="ProcessContent"> 
      <v t="SourceFilePath">1080i25-spts-3-NascarSchool-3min.ts</v> 
      <v t="DestinationDirectory">Media/e9959908-dabc-4691-a190-a30668d5c797</v> 
      <v t="HD">true</v> 
      <v t="HDCPDisable">false</v> 
      <v t="Status">true</v> 
      <v t="ServiceInformationID">e9959908-dabc-4691-a190-a30668d5c797</v> 
      <v t="AssetType">feature</v> 
      <v t="StreamFormat">rtp</v> 
     </a> 
     </al> 
     <sol /> 
     <rl> 
     <r>MPAA,R</r> 
     </rl> 
    </so> 
    <so xsi:type="ListingsItem"> 
     <v>0</v> 
     <id>test/1080i25spts3NascarSchool3mintsposter</id> 
     <t>poster</t> 
     <n>Nascar_Racing_School_poster</n> 
     <fl> 
     <f>SD</f> 
     </fl> 
     <al> 
     <a k="AssetId"> 
      <v>1080i25spts3NascarSchool3mintsposter</v> 
     </a> 
     <a k="DefaultLanguage"> 
      <v>en</v> 
     </a> 
     <a k="Content"> 
      <v t="FileName">nascarschool_new.jpg</v> 
      <v t="SizeInBytes" /> 
      <v t="NetworkType" /> 
      <v t="KBPS" /> 
      <v t="PlayReady" /> 
      <v t="WebInitiatorUrl" /> 
      <v t="LicenseServerProxyUrl" /> 
      <v t="Type" /> 
      <v t="PitchedFilename">nascarschool_new.jpg</v> 
     </a> 
     <a k="OrigFileLoc"> 
      <v>147\106\test-HD30002\Poster\nascarschool_new.jpg</v> 
     </a> 
     <a k="PosterUrl"> 
      <v>/posters/147/106/test-HD30002/Poster/nascarschool_new__{0}.jpg</v> 
     </a> 
     </al> 
     <sol /> 
     <rl> 
     <r>MPAA,R</r> 
     </rl> 
    </so> 
    </sol> 

Я использую ниже запрос: (конвертировать (XML, [имя_столбца])) запроса ('/ SO/SOL/AL/LicensingWindowStart/В/текст()') LicenseStartDate

. Может ли кто-нибудь помочь мне в этом?

+0

? Какие-либо общие ответы ниже? – pmbAustin

ответ

1

Я иду этот пример, чтобы работать ... вы, вероятно, придется изменить его, чтобы извлечь значение из столбца таблицы, или то, что вы действительно хотите или нужно сделать:

DECLARE @xml xml; 
    SET @xml = ' 
    <so> 
     <v>0</v> 
     <t>RightsMetadata</t> 
     <al> 
     <a k="LicensingWindowStart"> 
      <v>2014-09-12T00:00:00</v> 
     </a> 
     </al> 
     <sol /> 
    </so>' 

    SELECT CONVERT(datetime, 
       CONVERT(nvarchar(1000), 
        @xml.query('(/so/al/a[@k=''LicensingWindowStart''])/v/text()') 
       ) 
      ) AS LicensingWindowStart; 

первые два оператора (DECLARE и SET) просто настраивают тестовые данные.

SELECT запрашивает переменную xml, чтобы найти соответствующий узел, а затем преобразует это значение в datetime. Поскольку прямые преобразования xml-to-datetime не разрешены, я сначала конвертировал в nvarchar (1000), а затем преобразовал THAT в datetime. Результат выбран.

Поскольку я не уверен точно, что вы пытаетесь сделать (вы не указали какую-либо схему или другую информацию для контекста), я надеюсь, что этого достаточно, чтобы помочь вам найти правильное направление в решении вашей проблемы.

Возвращаясь к вашему примеру выше, я создал физическую таблицу с колонкой, не XML, который содержал XML в виде строки (не лучшая практика), и придумал этот тест для вас:

CREATE TABLE TextXmlTable (ColumnName nvarchar(1000)); 
    INSERT INTO TextXmlTable (ColumnName) 
    VALUES (' 
<sol> 
    <so> 
     <v>0</v> 
     <t>BusinessMetadata</t> 
     <al> 
      <a k="Price"> 
       <v>4.99</v> 
      </a> 
      <a k="Currency"> 
       <v>US</v> 
      </a> 
     </al> 
     <sol /> 
    </so> 
    <so> 
     <v>0</v> 
     <t>RightsMetadata</t> 
     <al> 
      <a k="LicensingWindowStart"> 
       <v>2008-09-12T00:00:00</v> 
      </a> 
      <a k="LicensingWindowEnd"> 
       <v>2015-09-19T23:59:59</v> 
      </a> 
      <a k="AvailabilityWindowStart"> 
       <v>2008-09-12T00:00:00</v> 
      </a> 
      <a k="AvailabilityWindowEnd"> 
       <v>2015-09-19T23:59:59</v> 
      </a> 
      <a k="NewReleaseWindow"> 
       <v>0</v> 
      </a> 
      <a k="MaximumViewingLimit"> 
       <v>10080</v> 
      </a> 
     </al> 
     <sol /> 
    </so> 
    <so type="ListingsItem"> 
     <v>0</v> 
     <id>test/1080i25spts3NascarSchool3mints_feature</id> 
     <t>feature</t> 
     <n>Nascar_Racing_School_feature</n> 
     <fl> 
      <f>HD</f> 
     </fl> 
     <al> 
      <a k="AssetId"> 
       <v>1080i25spts3NascarSchool3mints_feature</v> 
      </a> 
      <a k="StreamFormat"> 
       <v>rtp</v> 
      </a> 
      <a k="RuntimeSeconds"> 
       <v>175</v> 
      </a> 
      <a k="DefaultLanguage"> 
       <v>en</v> 
      </a> 
      <a k="Content"> 
       <v t="FileName">1080i25-spts-3-NascarSchool-3min.ts</v> 
       <v t="SizeInBytes" /> 
       <v t="NetworkType" /> 
       <v t="KBPS" /> 
       <v t="PlayReady" /> 
       <v t="WebInitiatorUrl" /> 
       <v t="LicenseServerProxyUrl" /> 
       <v t="Type" /> 
       <v t="PitchedFilename">1080i25-spts-3-NascarSchool-3min.ts</v> 
      </a> 
      <a k="ProcessContent"> 
       <v t="SourceFilePath">1080i25-spts-3-NascarSchool-3min.ts</v> 
       <v t="DestinationDirectory">Media/e9959908-dabc-4691-a190-a30668d5c797</v> 
       <v t="HD">true</v> 
       <v t="HDCPDisable">false</v> 
       <v t="Status">true</v> 
       <v t="ServiceInformationID">e9959908-dabc-4691-a190-a30668d5c797</v> 
       <v t="AssetType">feature</v> 
       <v t="StreamFormat">rtp</v> 
      </a> 
     </al> 
     <sol /> 
     <rl> 
      <r>MPAA,R</r> 
     </rl> 
    </so> 
    <so type="ListingsItem"> 
     <v>0</v> 
     <id>test/1080i25spts3NascarSchool3mintsposter</id> 
     <t>poster</t> 
     <n>Nascar_Racing_School_poster</n> 
     <fl> 
      <f>SD</f> 
     </fl> 
     <al> 
      <a k="AssetId"> 
       <v>1080i25spts3NascarSchool3mintsposter</v> 
      </a> 
      <a k="DefaultLanguage"> 
       <v>en</v> 
      </a> 
      <a k="Content"> 
       <v t="FileName">nascarschool_new.jpg</v> 
       <v t="SizeInBytes" /> 
       <v t="NetworkType" /> 
       <v t="KBPS" /> 
       <v t="PlayReady" /> 
       <v t="WebInitiatorUrl" /> 
       <v t="LicenseServerProxyUrl" /> 
       <v t="Type" /> 
       <v t="PitchedFilename">nascarschool_new.jpg</v> 
      </a> 
      <a k="OrigFileLoc"> 
       <v>147\106\test-HD30002\Poster\nascarschool_new.jpg</v> 
      </a> 
      <a k="PosterUrl"> 
       <v>/posters/147/106/test-HD30002/Poster/nascarschool_new__{0}.jpg</v> 
      </a> 
     </al> 
     <sol /> 
     <rl> 
      <r>MPAA,R</r> 
     </rl> 
    </so> 
</sol>' 
    ); 

    SELECT CONVERT(datetime, 
       CONVERT(nvarchar(1000), 
        (CONVERT(xml, [ColumnName])).query('(sol/so/al/a[@k=''LicensingWindowStart''])/v/text()') 
       ) 
      ) AS LicensingWindowStart 
    FROM TextXmlTable; 

Кажется, что ваша самая большая проблема заключалась в том, чтобы включить в ваш запрос узел «SOL» по вашему запросу ...

+0

Возможно, мне нужно будет добавить весь xml, чтобы быть более понятным .. с вашим запросом я просто получаю вывод как «1900-01-01 00: 00: 00.000» для всех столбцов. – Manoj

+0

Хорошо, я отредактировал на основе вашего обновленного XML ... Мне пришлось вернуть «SOL», и у меня возникли проблемы с «" в строке 40, что дало мне parse error с «undefined prefix», поэтому я удалил xsi только для этого примера. Вам все равно придется иметь дело с этим в вашем коде (предположительно префикс определяется в другом месте за пределами предоставленного вами примера). Надеюсь, это поможет. – pmbAustin

+0

... у вас все еще есть проблемы? Вы решили проблему? Помог ли этот ответ вообще? – pmbAustin

Смежные вопросы