2010-07-07 5 views
1

J'ai vu sur a website, un gars avait retourné ses informations de table de base de données comme une table html. C'était plutôt propre. Son code est le suivant:Table SQL Server arbitraire au tableau XHTML

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 

Je voudrais savoir s'il est possible de retourner une table HTML à partir d'une table arbitraire SQL Server. Je sais que les gens ont des opinions divergentes sur la question de savoir s'il existe ou non un meilleur moyen de le faire, mais ce n'est pas le but de cette question. Je suis nouveau à SQL et j'essaye juste d'apprendre mon chemin autour de lui. Mon code est le suivant.

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

Il retourne quelque chose comme:

<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> 

Je préférerais sortie comme:

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

Est-ce faisable dans une transaction SQL Server? Si oui, comment cela serait-il fait?

Répondre

0

Il est laid, mais j'ai tout compris ...

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 
+0

C'est en effet moche. Votre requête plus simple a retourné quelque chose de facile à convertir dans le format requis par XSLT. Ce serait une bien meilleure approche. –

+0

Ne vous inquiétez pas, je ne vais pas l'utiliser. C'était un exercice de curiosité. – kzh

0

peut-être c'est une bonne utilisation de XSLT

+0

Je pourrais certainement faire en XSLT, mais je me demandais s'il était possible dans SQL Server. – kzh

2

Je ne suis pas sûr que ce soit une bonne chose à faire. Le principe de la séparation des préoccupations (ou «encapsulation») implique qu'un ingénieur de base de données devrait se préoccuper des données, pas de la présentation; c'est-à-dire qu'une requête SQL doit renvoyer des informations qui sont ensuite formatées pour l'affichage par une vue séparée. Renvoyer HTML à partir d'une procédure SQL déplace plus de travail sur le serveur de base de données, nécessite de changer la base de données quand une nouvelle version de HTML vient ou vous voulez un nouveau format de table, confond le DBA ...

Je ne pense pas que cela est une bonne façon de faire des affaires.