2010-08-13 2 views
0

Мне было интересно, как я могу взять схему таблицы в SQL Server и сгенерировать из нее XML-документ. Идеальным было бы, если бы я перешел в мое имя базы данных («SalesOrders») и XML-документ возвращается, читать что-то вроде:Создать XML-форматированную схему таблиц из SQL Server 2005?

<table=”SalesOrders”> 
<columns> 
    <name=”SalesOrderID”/> 
     <datatype=”int”/> 
     <allowNulls=”false”/> 
    </name> 
    <name=”DateOfSale”> 
     <datatype=”DateTime”/> 
     <allowNulls=”false”/> 
    </name> 
</columns> 
</table> 

Вы получаете идею. Что-то в этом направлении, схема XSD тоже будет прекрасна. В затылке я думаю, что у SQL Server есть механизмы для этого, но я не уверен. Большое спасибо за ваши предложения.

ответ

1

Что-то вроде следующего будет работать. Кроме того, обратите внимание, что ваш XML-образец не очень хорошо сформирован. Я позволил сделать его хорошо сформированным.

declare @tableName varchar(255) 

select @tableName = 'SalesOrders' 

select (
    select column_name, 
      data_type, 
      case(is_nullable) 
       when 'YES' then 'true' 
       else 'false'  
      end as is_nullable 
    from information_schema.columns [columns] 
    where table_name = @tableName 
    for xml auto, type 
).query (' <table name="{sql:variable("@tableName")}"> 
      { 
       for $column in /columns 
       return 

       <column name="{data($column/@column_name)}"> 
        <dataType value="{data($column/@data_type)}"/> 
        <allowNulls value="{data($column/@is_nullable)}"/> 
       </column> 
      } 
      </table>    
') 

или

select @tableName as "@name", 
(
    select column_name as "@name", 
     data_type as "dataType/@value", 
     case(is_nullable) 
      when 'YES' then 'true' 
      else 'false'  
     end as "allowNulls/@value" 
    from information_schema.columns 
    where table_name = @tableName 
    for xml path('column'), type 
) 
for xml path('table') 

обоих запросов будет производить следующее:

<table name="SalesOrders"> 
<columns> 
    <column name="SalesOrderID"> 
     <datatype value="int"/> 
     <allowNulls value="false"/> 
    </column > 
    <column name="DateOfSale"> 
     <datatype value="DateTime"/> 
     <allowNulls value="false"/> 
    </column > 
</columns> 
</table> 

В качестве примечания:

Хотя это, как правило, дело вкуса при принятии решения о элементов и атрибутов в структуре XML, я бы сделал dataType и allowNulls атрибуты в отличие от элементов, которые кажутся мне более интуитивными. Таким образом, структура XML будет выглядеть примерно так:

<table name="SalesOrders">  
    <columns>  
     <column name="SalesOrderID" datatype="int" allowNulls="false"/> 
     <column name="DateOfSale" datatype="DateTime" allowNulls="false"/> 
    </columns>  
</table> 

Вышеупомянутые запросы могут быть легко изменены, чтобы отразить это изменение.

+0

Спасибо за оба ваши предложения - очень благодарен. – larryq

1

Как насчет

Select * From Information_Schema.Columns For XML Auto 
Смежные вопросы