我正在尝试生成XML,它将使用SQL 2008输出任何表的结构和数据。
因此,例如,您将表名传递给此存储过程,它将以此格式生成XML:
<TABLE name="mytable">
<ROW>
<COL name="firstname">John</COL>
<COL name="lastname">Smith</COL>
</ROW>
<ROW>
<COL name="firstname">Bob</COL>
<COL name="lastname">Jones</COL>
</ROW>
</TABLE>
如果有一个名为mytable的表(firstname varchar(100),lastname varchar(100))
您可以像这样调用存储过程:
exec spGenerateTableData @tablename='mytable'
我无法获得的技巧是如何制作COL元素的列名属性。我确定你需要在select语句中使用FOR XML子句。请记住,这应该适用于任何传入的表 - 因此您事先不知道列的名称。
感谢您的帮助!
答案 0 :(得分:3)
您可以像这样使用information_schema.columns
和for xml path
来获得所需的结构。
select
'MyTable' as 'TABLE/@name',
(select XMLCol as '*'
from (select XMLCol
from MyTable
cross apply
(select
COLUMN_NAME as 'COL/@name',
case COLUMN_NAME when 'FirstName' then FirstName end as COL,
case COLUMN_NAME when 'LastName' then LastName end as COL
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = 'MyTable'
for xml path(''), root('ROW'), type) as Row(XMLCol)
) as Rows
for xml path(''), type) as 'TABLE'
for xml path('')
但在你的情况下,除了动态构建之外我没有别的选择。
declare @TableName varchar(50) = 'MyTable'
declare @ColList varchar(8000)
select @ColList = coalesce(@ColList+', ', '') + 'case COLUMN_NAME when '''+COLUMN_NAME+''' then '+COLUMN_NAME+' end as COL'
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = @TableName
declare @SQL varchar(max) =
'select
''_TABLENAME_'' as ''TABLE/@name'',
(select XMLCol as ''*''
from (select XMLCol
from _TABLENAME_
cross apply
(select
COLUMN_NAME as ''COL/@name'',
_COLLIST_
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = ''_TABLENAME_''
for xml path(''''), root(''ROW''), type) as Row(XMLCol)
) as Rows
for xml path(''''), type) as ''TABLE''
for xml path('''')'
set @SQL = replace(@SQL, '_TABLENAME_', @TableName)
set @SQL = replace(@SQL, '_COLLIST_', @ColList)
exec (@SQL)
答案 1 :(得分:1)
您可以在数据字典中查询列名称。 查看information_schema.columns。
像
这样的东西select column_name
from information_schema.columns
where table_name = 'mytable'
会给你列名。
答案 2 :(得分:0)
我不知道你是否使用上面指定的格式。如果定义该格式的模式是应用程序与其他应用程序定义的接口,那么它可能不应该被篡改。
但是,如果您可以使用任何 XML格式来序列化表结构和数据,那么将数据提取到.NET数据集并调用
可能更实际 yourDataset.WriteXml("[yourFileName].xml")
可以从生成的XML文件中推断出有关表及其列的结构信息,并且可以非常轻松地从另一个.NET应用程序以编程方式获取此文件。