Создать схему таблицы в формате XML из SQL Server 2005? - PullRequest
1 голос
/ 14 августа 2010

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

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

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

Ответы [ 2 ]

1 голос
/ 14 августа 2010

Что-то вроде следующего будет работать. Также обратите внимание, что ваш пример 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>

Приведенные выше запросы можно легко изменить, чтобы отразить это изменение.

1 голос
/ 14 августа 2010

Как насчет

Select * From Information_Schema.Columns For XML Auto
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...