views:

28

answers:

2

Hi everyone,

I was wondering how I might take a table schema in SQL Server and generate an XML document from it. The ideal would be if I passed in my database name (“SalesOrders”) and an XML doc comes back reading something like:

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

You get the idea. Something along these lines, an XSD schema would be fine too. In the back of my head I think SQL Server has mechanisms for doing this but I'm not positive. Many thanks for your suggestions.

+1  A: 

How about

Select * From Information_Schema.Columns For XML Auto
Stu
+1  A: 

Something like the following would work. Also, note that your example XML is not well formed. I took the liberty of making it well formed.

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>            
')

or

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')

Both queries would produce the following:

<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>

As a side note:

Although it's usually a matter of taste when deciding on elements vs attributes in an XML structure, I would make dataType and allowNulls attribtes as opposed to elements, which seems more intuitive to me. So, the XML structure would look something like this:

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

The above queries can be easily modified to reflect this change.

Garett
Thanks for both of your suggestions-- much appreciated.
larryq