sql >> データベース >  >> RDS >> Sqlserver

表データのXMLを生成するSQL

    information_schema.columns を使用できます および for xml path このようにして、必要な構造を取得します。

    select
      'MyTable' as 'TABLE/@name',
      (select XMLCol as '*'
       from (select XMLCol
             from MyTable
               cross apply
                (select
                   COLUMN_NAME as 'COL/@name',
                   case COLUMN_NAME when 'FirstName' then FirstName end as COL,
                   case COLUMN_NAME when 'LastName' then LastName end as COL
                 from INFORMATION_SCHEMA.COLUMNS
                 where TABLE_NAME = 'MyTable'
                 for xml path(''), root('ROW'), type) as Row(XMLCol)
            ) as Rows
       for xml path(''), type) as 'TABLE'
    for xml path('')
      

    しかし、あなたの場合、これを動的に構築する以外に選択肢はありません。

    declare @TableName varchar(50) = 'MyTable'
    
    declare @ColList varchar(8000)
    select @ColList = coalesce(@ColList+', ', '') + 'case COLUMN_NAME when '''+COLUMN_NAME+''' then '+COLUMN_NAME+' end as COL'
    from INFORMATION_SCHEMA.COLUMNS
    where TABLE_NAME = @TableName
    
    declare @SQL varchar(max) = 
    'select
      ''_TABLENAME_'' as ''TABLE/@name'',
      (select XMLCol as ''*''
       from (select XMLCol
             from _TABLENAME_
               cross apply
                (select
                   COLUMN_NAME as ''COL/@name'',
                   _COLLIST_
                 from INFORMATION_SCHEMA.COLUMNS
                 where TABLE_NAME = ''_TABLENAME_''
                 for xml path(''''), root(''ROW''), type) as Row(XMLCol)
            ) as Rows
       for xml path(''''), type) as ''TABLE''
    for xml path('''')'
    
    set @SQL = replace(@SQL, '_TABLENAME_', @TableName)
    set @SQL = replace(@SQL, '_COLLIST_', @ColList)
    
    exec (@SQL)
      

    1. SELECT*FROMテーブルWHERE列=1,2,3,4

    2. ベーステーブルが別のデータベースにある場合、ベーステーブルではなくビューでSelectを付与します

    3. 3つの異なる日付間隔のデータで1つの列を数回表示する

    4. .NETOracleマネージドデータアクセス接続プールが機能しないか遅い