0

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
4

2 に答える 2

0

上記の質問では、ループを避けて 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
于 2013-04-09T14:46:33.837 に答える