sql >> Databasteknik >  >> RDS >> Sqlserver

Return Välj uttalande som formaterad HTML

Här är ett riktigt fult sätt att formulera HTML manuellt. Det finns en god anledning till att detta inte hör hemma i SQL Server. Jag är säker på att någon XML-guru kommer att komma och skämma ut mig med en mycket mer okomplicerad metod (jag spelade med Simon Sabins lösning men kunde inte översätta det till ditt krav), men för nu:

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 - inte exakt vad du bad om när det gäller blanksteg, men identisk HTML-rendering:

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

REDIGERA För en mycket renare lösning, samt mycket dramatik och en bra demonstration av varför @ZeeTee är den mest irriterande användaren på StackOverflow, se Mikaels lösning på följdfrågan:

Returnera Välj uttalande som formaterad HTML (SQL 2005)



  1. Ändra namnet på en SQL-databas

  2. MySQL bästa tillvägagångssätt för db-normalisering, relationer och främmande nycklar

  3. Jag får dubbla resultat från mysql-frågan när jag använder internationella tecken, dvs Å/Ä=A &Ö=O,

  4. Wampserver 2.1 ger en orange ikon efter installation på Windows 7