Sybase ASE xmltable - шаблон не работает

Я пытаюсь сделать следующее с Sybase ASE 15.0.2, но мне трудно пройти:

Мотив состоит в том, чтобы извлечь содержимое тега ‹tables›. Может ли кто-нибудь помочь мне с этим?

Обратитесь — http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc30020.1502/html/xmlb/CFHIDCJC.htm

declare @purgeTableInfo varchar(16300)
select @purgeTableInfo = 
    '<purge>
        <start-time>00:00:000</start-time>
        <end-time>03:00:000</end-time>
        <tables>
            <table>
                <table_name>table1</table_name>
                <owner>dbo</owner>
                <columns>
                    <column>
                        <column_name>column1</column_name>
                        <column_value>121212xdfsdsdsdsd</column_value>
                        <column_condition>like</column_condition>
                    </column>
                    <column>
                        <column_name>column2</column_name>
                        <column_value>121212xdfsdsdsdsd</column_value>
                        <column_condition>like</column_condition>
                    </column>
                </columns>
            </table>
        </tables>
    </purge>'
        select * 
          from xmltable('/purge/tables/table/columns/column'
                    passing @purgeTableInfo
                    columns columnName varchar(255) path 'column_name',
                            tableName varchar(255) pattern '../../table_name') as purgeInputDetails

person user1549605    schedule 05.04.2013    source источник


Ответы (2)


В моем предыдущем вопросе я пытался избежать зацикливания и пытался использовать xmltable(), чтобы он был похож на запрос. Но оказывается, что xmltable() немного жесткая для более сложных структур, таких как несколько таблиц и столбцов xml (в своем вопросе я упомянул базовый случай с одной таблицей и несколькими столбцами xml). Итак, я иду по пути "xmlextract()+looping". Вот решение для нескольких таблиц/несколько столбцов xml:

declare @i int
declare @extractedTable varchar(50)
declare @j int
declare @extractedColumn varchar(50)
select @i = 1
select @extractedTable = ''

while (@extractedTable != null)
begin
    select @extractedTable=convert(varchar(50),xmlextract ('/purge/tables/table['+convert(varchar(5),@i)+']/table_name/text()', @purgeTableInfo))
    print "%1!", @extractedTable

    if(@extractedTable != null)
    begin
        select @j = 1
        select @extractedColumn = ''
        while (@extractedColumn != null)
        begin
            select @extractedColumn=convert(varchar(50),xmlextract ('/purge/tables/table['+convert(varchar(5),@i)+']/columns/column['+convert(varchar(5),@j)+']/column_name/text()', @purgeTableInfo))
            print "%1!", @extractedColumn
            if(@extractedColumn != null)
            begin
                insert into tabCols select @extractedTable as tableName, @extractedColumn as columnName
                select @j = @j+1
            end
        end
        select @i = @i+1
    end
end
commit
person user1549605    schedule 09.04.2013

Сделайте это в 1 запросе без WHILE или Coursor

declare @XML text
select @XML = 
    '<purge>
        <start-time>00:00:000</start-time>
        <end-time>03:00:000</end-time>
        <tables>
            <table>
                <table_name>table1</table_name>
                <owner>dbo</owner>
                <columns>
                    <column>
                        <column_name>column1</column_name>
                        <column_value>121212xdfsdsdsdsd</column_value>
                        <column_condition>like</column_condition>
                    </column>
                    <column>
                        <column_name>column2</column_name>
                        <column_value>121212xdfsdsdsdsd</column_value>
                        <column_condition>like</column_condition>
                    </column>
                </columns>
            </table>
        </tables>
    </purge>'
    
select
  P.starttime
, P.endtime
, T.table_name
, T.owner
, C.column_name
, C.column_value
, C.column_condition
from
  --<purge>
  xmltable('/purge'
  passing @XML
  columns 
    ROW_NUM int for ordinality
  , starttime time path 'start-time'
  , endtime time path 'end-time'
  ) AS P
  --/purge/tables/table  
  LEFT JOIN xmltable('/tables/table'
  passing ISNULL(CAST(xmlextract('/purge['+convert(varchar(5), P.ROW_NUM)+']/tables', @XML) as VARCHAR(16000)), '<tables><table></table></tables>')
  columns
    ROW_NUM int for ordinality
  , table_name varchar(50) path 'table_name'
  , owner varchar(100) path 'owner'
  ) AS T ON 1 = 1
  --/purge/tables/table/columns/column 
  LEFT JOIN xmltable('/columns/column'
  passing ISNULL(CAST(xmlextract('/purge['+convert(varchar(5), P.ROW_NUM)+']/tables/table['+convert(varchar(5), T.ROW_NUM)+']/columns', @XML) as VARCHAR(16000)), '<columns><column></column></columns>')
  columns
    ROW_NUM int for ordinality
  , column_name varchar(50) path 'column_name'
  , column_value varchar(500) path 'column_value'
  , column_condition varchar(50) path 'column_condition'  
  ) AS C ON 1 = 1     
 

person Vampir    schedule 18.08.2017