任意SQL Server表到XHTML表

时间:2010-07-07 21:28:30

标签: sql-server xml xhtml html-table

我在a website看到,一个人将他的数据库表信息作为html表返回。它非常整洁。他的代码如下:

select 2 [@cellpadding]
      ,2 [@cellspacing]
      ,1 [@border]
--This returns the header
        ,(select th
            from (select 'Database Table' th
               union all
                  select 'Entity Count'
               union all
                  select 'Total Rows') d --name of this alias is irrelevant but you have to have one
          for xml path(''),type) tr --tr here defines that the header row will be a tr element

--This returns the rows in the table
        ,(select (select dbtable [*]  for xml path('td'),type),
                 (select entities [*] for xml path('td'),type),
                 (select rows [*] for xml path('td'),type)
            from (--We have to use a derived table because we are grouping
                  select dbtable  = object_name( object_id ),
                         entities = count( distinct name ),
                         rows     = count( * )
                    from sys.columns
                group by object_name( object_id )) data
                  --name of this alias is irrelevant but you have to have one
           for xml path ('tr'),type) --path('tr') turns each row into a tr element
 for xml path('table'), type

我想看看是否可以从一个任意SQL Server表返回一个html表。我知道人们对是否有最好的方法有不同的看法,但这不是这个问题的重点。我是SQL的新手,我只是想学习我的方法。我的代码如下。

select dataid as [@id], *
from   table_1
for    xml path('tr'), root('table')

它返回类似:

<table>
  <tr id="1">
    <column_1>data</column_1>
    <column_2>data</column_2>
  </tr>
  <tr id="2">
    <column_1>data</column_1>
    <column_2>data</column_2>
  </tr>
</table>

我更喜欢输出:

<table>
  <tr id="1">
    <td>data</td>
    <td>data</td>
  </tr>
  <tr id="2">
    <td>data</td>
    <td>data</td>
  </tr>
</table>

这在SQL Server事务中是否可行?如果是这样,它会怎么做?

3 个答案:

答案 0 :(得分:2)

我真的不确定这是一件好事。关注点分离原则(或“封装”)意味着数据库工程师应关注数据,而不是表示;也就是说,SQL查询应该返回信息,然后将其格式化以便通过单独的视图显示。从SQL过程返回HTML会将更多工作转移到数据库服务器,需要在新版本的HTML出现时更改数据库,或者您需要新的表格格式,这会使DBA感到困惑......

我不认为这是开展业务的好方法。

答案 1 :(得分:0)

也许这是一个很好的使用XSLT

答案 2 :(得分:0)

这很难看,但我想出来了......

declare @tds nvarchar(max),
        @sql nvarchar(max),
        @table char(10)
set @sql = 'select(select td from( '
set @table = 'table_2'
set @tds = ''

select @tds = @tds + 'union all select cast([' + Column_name + '] as nvarchar(max)) ' + char(13) + char(10)
FROM    INFORMATION_SCHEMA.Columns
WHERE   TABLE_NAME = @table

set @tds = stuff(@tds, 1, 10, '')
set @tds = stuff(@tds, charindex('))',@tds, 1), 2, ')) td ')

set @sql = @sql + @tds

SET @sql = @sql + ')something_here for xml path(''''), type) from table_2 '
SET     @sql = @sql + ' FOR XML PATH(''tr''), ROOT(''tbody''), TYPE'

EXEC SP_EXECUTESQL @sql