2011-04-06 27 views
2

我試圖將輸出結構和任何表的數據使用SQL 2008SQL生成表數據的XML

這樣生成XML,例如,你在一個表名傳遞給該存儲程序,它會以這種格式生成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子句。請記住,這應該適用於任何傳入的表格 - 因此您事先不知道列的名稱。

感謝您的幫助!

回答

3

您可以使用information_schema.columnsfor 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) 
+0

Mikael - 那真棒。這正是我所期待的。謝謝! – KTH 2011-04-07 13:06:27

1

您可以查詢數據字典中的列名稱。 查看information_schema.columns。

喜歡的東西

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

會給你的列名。

0

我不知道你是否使用上面指定的格式。如果定義該格式的模式是您的應用程序與其他應用程序定義的接口,那麼它可能不應該被篡改。

不過,如果你可以使用任何 XML格式序列化你的表結構和數據,那麼也許這將是更實際的數據讀取到數據集的.NET和公正來電

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

的關於表和它的列的結構信息可以從結果XML文件中推斷出來,並且從另一個.NET應用程序以編程方式拾取這個文件是非常容易的。