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