Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Trả lại câu lệnh Chọn dưới dạng HTML được định dạng

Đây là một cách thực sự xấu để tạo HTML theo cách thủ công. Có một lý do chính đáng mà điều này không thuộc về SQL Server. Tôi chắc chắn rằng một số chuyên gia XML sẽ đến và làm tôi bối rối với một phương pháp đơn giản hơn nhiều (Tôi đã chơi với Giải pháp củaSimon Sabin nhưng không thể dịch nó theo yêu cầu của bạn), nhưng hiện tại:

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

Kết quả - không chính xác những gì bạn yêu cầu về khoảng trắng, nhưng hiển thị HTML giống hệt nhau:

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

CHỈNH SỬA Để có một giải pháp gọn gàng hơn nhiều, cũng như nhiều kịch tính và một minh chứng tốt về lý do tại sao @ZeeTee là người dùng khó chịu nhất trên StackOverflow, hãy xem giải pháp của Mikael cho câu hỏi tiếp theo:

Trả lại câu lệnh chọn dưới dạng HTML được định dạng (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. Lưu byte [] vào cơ sở dữ liệu SQL Server từ C #

  2. Sự cố SSIS Không giải mã được nút XML được bảo vệ

  3. Sử dụng hợp nhất trong SQL Server để cập nhật bảng thứ ba

  4. Sắp xếp các cột cho xoay vòng động

  5. Điểm của COLLATIONS cho các cột nvarchar (Unicode) là gì?