Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Kembali Pilih Pernyataan sebagai HTML yang diformat

Berikut adalah cara yang sangat buruk dalam merumuskan HTML secara manual. Ada alasan bagus mengapa ini tidak termasuk dalam SQL Server. Saya yakin beberapa guru XML akan datang dan mempermalukan saya dengan metode yang jauh lebih mudah (saya bermain dengan Solusi Simon Sabin tetapi tidak dapat menerjemahkannya sesuai kebutuhan Anda), tetapi untuk saat ini:

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

Hasil - tidak persis seperti yang Anda minta dalam hal ruang putih, tetapi rendering HTML yang identik:

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

EDIT Untuk solusi yang jauh lebih bersih, serta banyak drama dan demonstrasi yang bagus tentang mengapa @ZeeTee adalah pengguna yang paling menyebalkan di StackOverflow, lihat solusi Mikael untuk pertanyaan lanjutan:

Return Select Statement as formatted 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. Impor Excel SSIS Memaksa Jenis Kolom Salah

  2. Bagaimana Cara Menggunakan count dan Group By dengan Self join di tabel yang sama di sql server 2008?

  3. SQL Server:gunakan parameter di CREATE DATABASE

  4. Tambahkan Kolom yang Dihitung ke Tabel yang Ada di SQL Server

  5. Cara Menentukan Lokasi File Data dan File Log saat Membuat Database di SQL Server