从SQL Server 2005生成XML格式的表架构?

时间:2010-08-13 22:53:29

标签: xml sql-server-2005 xsd

我想知道如何在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 个答案:

答案 0 :(得分:1)

怎么样

Select * From Information_Schema.Columns For XML Auto

答案 1 :(得分: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结构中的元素与属性时通常是一种品味问题,但我会将dataTypeallowNulls作为元素而不是元素,这对我来说似乎更直观。因此,XML结构看起来像这样:

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

可以轻松修改上述查询以反映此更改。