sql >> Database teknologi >  >> RDS >> Sqlserver

Tilbage Vælg erklæring som formateret HTML

Her er en rigtig grim måde at formulere HTML manuelt. Der er en god grund til, at dette ikke hører hjemme i SQL Server. Jeg er sikker på, at en eller anden XML-guru vil komme og gøre mig forlegen med en meget mere ligetil metode (jeg spillede med Simon Sabins løsning men kunne ikke oversætte det til dit krav), men indtil videre:

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

Resultat - ikke lige det du bad om med hensyn til hvidt mellemrum, men identisk HTML-gengivelse:

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

REDIGER For en meget renere løsning, samt en masse drama og en god demonstration af, hvorfor @ZeeTee er den mest irriterende bruger på StackOverflow, se Mikaels løsning på opfølgende spørgsmål:

Returner Select Statement som formateret HTML (SQL) 2005)



  1. Udvikl React m/ full-stack (WAMP) lokalt

  2. Hvordan bruger man XPath med en variabel i Oracle XMLTable?

  3. hvordan man dropper alle databaser undtagen nogle få i postgres

  4. Hvordan øges dbms_output buffer?