我想知道如何在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有这样的机制,但我并不积极。非常感谢您的建议。
答案 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结构中的元素与属性时通常是一种品味问题,但我会将dataType
和allowNulls
作为元素而不是元素,这对我来说似乎更直观。因此,XML结构看起来像这样:
<table name="SalesOrders">
<columns>
<column name="SalesOrderID" datatype="int" allowNulls="false"/>
<column name="DateOfSale" datatype="DateTime" allowNulls="false"/>
</columns>
</table>
可以轻松修改上述查询以反映此更改。