繁体   English   中英

SQL生成表数据的XML

[英]SQL to generate XML of table data

我正在尝试生成XML,该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的表(名字为varchar(100),名字为varchar(100))

您将可以这样调用存储过程:

exec spGenerateTableData @tablename='mytable'

我无法获得的技巧是如何使COL元素的列名属性。 我确定您需要在select语句中使用FOR XML子句。 请记住,这在传入任何表的情况下都应该有效-因此您事先不知道各列的名称。

谢谢你的帮助!

您可以使用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)

您可以在数据字典中查询列名。 查看information_schema.columns。

就像是

select column_name
from information_schema.columns
where table_name = 'mytable'

将为您提供列名。

我不知道您是否必须使用上面指定的格式。 如果定义该格式的模式是您的应用程序与其他应用程序定义的接口,则可能不应对其进行篡改。

不过,如果您可以使用任何 XML格式来序列化表结构和数据,那么将数据提取到.NET数据集中并调用

 yourDataset.WriteXml("[yourFileName].xml")

可以从生成的XML文件中推断出有关表及其列的结构信息,并且很容易从另一个.NET应用程序中以编程方式选择此文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM