Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Return Select Statement jako sformatowany HTML

Oto naprawdę brzydki sposób ręcznego formułowania kodu HTML. Istnieje dobry powód, dla którego to nie pasuje do SQL Server. Jestem pewien, że pojawi się jakiś guru XML i zawstydzi mnie znacznie prostszą metodą (zabawiłem się Rozwiązanie Simona Sabina ale nie mogłem przetłumaczyć tego na twoje wymagania), ale na razie:

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

Wynik - nie dokładnie to, o co prosiłeś, jeśli chodzi o odstępy, ale identyczne renderowanie 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>

EDYTUJ Aby uzyskać znacznie czystsze rozwiązanie, a także dużo dramatu i dobrą demonstrację, dlaczego @ZeeTee jest najbardziej denerwującym użytkownikiem na StackOverflow, zobacz rozwiązanie Mikaela na pytanie uzupełniające:

Return Select Statement jako sformatowany HTML (SQL 2005)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. EXISTS vs JOIN i użycie klauzuli EXISTS

  2. Uzyskaj identyfikator ostatnio wstawionego rekordu — Access DAO, ODBC, SQL Server 2008 Identity Field

  3. Wyzwalacz SQL Server wstawia wartości z nowego wiersza do innej tabeli

  4. Mutex analogowy w SQL?

  5. Zapytanie o podział serwera SQL