Search code examples
xml-parsingsap-ase

Sybase ASE xmltable - pattern not working


I am trying the following with Sybase ASE 15.0.2 but finding it hard to get through:

The motive is to extract the contents of <tables> tag. Could someone help me with this?

Refer - 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

Solution

  • In my above question, I was trying to avoid looping and trying to use xmltable() so that it is just like a query. But, it turns out that, xmltable() is a little rigid for more complex structures like multiple tables and columns xml (in my question, I mentioned the base case of single table and multiple columns xml). So, I am going by the "xmlextract()+looping" way. Here is the solution for multiple table/ multiple columns 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