sql >> Databáze >  >> RDS >> Sqlserver

Return Select Statement jako formátovaný HTML

Zde je opravdu ošklivý způsob, jak ručně formulovat HTML. Existuje dobrý důvod, proč to nepatří do SQL Serveru. Jsem si jistý, že se objeví nějaký XML guru a přivede mě do rozpaků mnohem přímočařejší metodou (hrál jsem s Řešení Simona Sabina ale nemohl jsem to přeložit na váš požadavek), ale prozatím:

DECLARE @x TABLE(Gender VARCHAR(6), Age INT, Name VARCHAR(32));

INSERT @x VALUES  ('Male',   30, 'Bill'),  ('Female', 27, 'Jenny'),
                  ('Female', 27, 'Debby'), ('Male',   44, 'Frank');

DECLARE @html NVARCHAR(MAX) = N'';

;WITH x AS ( SELECT x.Age, x.Gender, x.Name,
    dr = DENSE_RANK() OVER (PARTITION BY x.Gender ORDER BY x.Age),
    gn = ROW_NUMBER() OVER (PARTITION BY x.Gender ORDER BY x.Age),
    rn = ROW_NUMBER() OVER (ORDER BY x.Gender DESC, x.Age)
  FROM @x AS x ) SELECT @html +=
    CHAR(13) + CHAR(10) + CASE WHEN c1.gn = 1 THEN 
        CASE WHEN c1.rn > 1 THEN '</li></ul></li></ul>' ELSE '' END + '<ul><li>' 
        + c1.Gender ELSE '' END + CHAR(13) + CHAR(10) + CHAR(9) 
        + CASE WHEN c1.gn = 1 OR c1.Age <> c3.Age THEN 
        CASE WHEN c1.gn > 1 THEN '</li>' ELSE '<ul>' END + '<li>' 
        + CONVERT(VARCHAR(32), c1.Age) ELSE '' END + CHAR(13) + CHAR(10) + CHAR(9) 
        + CHAR(9) + CASE WHEN (c1.gn = 1 OR c1.Age <> c3.Age) THEN '<ul>' ELSE '' END 
        + '<li>' + c1.Name + '</li>' + CASE WHEN c1.Age <> c2.Age OR c1.dr <> c2.dr 
        THEN '</ul>' ELSE '' END
FROM x AS c1 
LEFT OUTER JOIN x AS c2
ON c1.rn = c2.rn - 1
LEFT OUTER JOIN x AS c3
ON c1.rn = c3.rn + 1
ORDER BY c1.Gender DESC, c1.Age;

SELECT @html += '</ul></li></ul></li></ul>';

PRINT @html; -- note you will need to deal with this 
             -- in another way if the string is large

Výsledek – ne přesně to, co jste požadovali, pokud jde o bílé místo, ale stejné vykreslování HTML:

<ul><li>Male
    <ul><li>30
        <ul><li>Bill</li></ul>

    </li><li>44
        <ul><li>Frank</li></ul>
</li></ul></li></ul><ul><li>Female
    <ul><li>27
        <ul><li>Jenny</li>


        <li>Debby</li></ul></li></ul></li></ul>

UPRAVIT Pro mnohem čistší řešení, stejně jako spoustu dramatu a dobrou ukázku toho, proč je @ZeeTee nejotravnějším uživatelem na StackOverflow, naleznete Mikaelovo řešení následné otázky:

Vrátit příkaz k výběru jako formátovaný HTML (SQL 2005)



  1. Wordpress aktualizuje tabulku mysql

  2. Jak odstranit velká data tabulky v SQL bez protokolu?

  3. Jak vybrat pouze číselná data z mysql?

  4. Neznámý Sloupec V Ustanovení Kde