SQL для генерации XML табличных данных - PullRequest
2 голосов
/ 07 апреля 2011

Я пытаюсь сгенерировать XML, который будет выводить структуру и данные любой таблицы с использованием SQL 2008.

Так, например, вы передали бы имя таблицы для этой хранимой процедуры, и она сгенерируетXML в этом формате:

<TABLE name="mytable">
  <ROW>
    <COL name="firstname">John</COL>
    <COL name="lastname">Smith</COL>
  </ROW>
  <ROW>
    <COL name="firstname">Bob</COL>
    <COL name="lastname">Jones</COL>
  </ROW>
</TABLE>

Если бы существовала таблица с именем mytable (имя varchar (100), фамилия varchar (100))

Вы могли бы вызвать хранимую процедуру следующим образом:

exec spGenerateTableData @tablename='mytable'

Хитрость, которую я не могу понять, заключается в том, как сделать атрибуты имен столбцов элемента COL.Я уверен, что вам нужно использовать предложение FOR XML в операторе select.Имейте в виду, это должно работать, если передается любая таблица - поэтому вы не знаете заранее названия столбцов.

Спасибо за любую помощь!

Ответы [ 3 ]

3 голосов
/ 07 апреля 2011

Вы можете использовать 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 голос
/ 07 апреля 2011

Вы можете запросить в словаре данных имена столбцов.Проверьте information_schema.columns.

Что-то вроде

select column_name
from information_schema.columns
where table_name = 'mytable'

даст вам имена столбцов.

0 голосов
/ 07 апреля 2011

Я не знаю, если у вас есть , чтобы использовать формат, который вы указали выше. Если схема, определяющая этот формат, является определенным интерфейсом вашего приложения с другими приложениями, то, вероятно, не следует вмешиваться.

Тем не менее, если бы вы могли использовать любой формат XML для сериализации структуры и данных вашей таблицы, то, возможно, было бы более практично извлечь ваши данные в набор данных .NET и просто вызвать

 yourDataset.WriteXml("[yourFileName].xml")

Структурная информация о таблице и ее столбцах может быть получена из полученного XML-файла, и этот файл очень просто программно получить из другого приложения .NET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...