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