Giới thiệu
Có thể tạo mã HTML từ truy vấn SQL không? Câu trả lời là có.
Một truy vấn chọn trả về kết quả dưới dạng rowset. Bạn có thể tùy chọn truy xuất kết quả chính thức của truy vấn SQL dưới dạng XML bằng cách chỉ định mệnh đề XML trong truy vấn. Bằng cách sử dụng cho mệnh đề XML, chúng tôi cũng có thể trả về kết quả ở định dạng HTML, nhưng cần phải điều chỉnh một truy vấn một chút. Chúng ta có thể sử dụng thủ thuật này để tạo một số trang HTML tĩnh.
By using FOR XML clause we can also return results in HTML format, but need to tweak a query a bit. We can use this trick to generate some static HTML pages.
Tạo bảng HTML từ truy vấn SQL.
Trước khi viết truy vấn cần hoàn tất mẫu HTML về cách bạn muốn hiển thị dữ liệu của mình.
<table><caption></caption>
<thead>
<tr>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
</tr>
</tbody>
<tfoot>
<tr>
<td></td>
</tr>
</tfoot>
</table><caption> - used to give a title for your table
<thead> - used for table column headers
<tbody> - cells / data for table
<tfoot> - aggregated values of your data like count, sum etc..,
Dựa trên mẫu trên ở đây, tôi đã tạo một truy vấn mẫu sẽ trả về mã HTML
SELECT(SELECT 'Sample Query to Generate HTML' FOR XML PATH(''),TYPE) AS 'caption',
(SELECT 'column-1' AS th, 'column-2' AS th, 'column-3' AS th FOR XML raw('tr'),ELEMENTS, TYPE) AS 'thead',
(SELECT col1 AS td, col2 AS td, col3 AS td
FROM
(SELECT 'row1-c1' as col1, 'row1-c2' as col2, 'row1-c3' as col3
UNION SELECT 'row2-c1' as col1, 'row2-c2' as col2, 'row2-c3' as col3
UNION SELECT 'row3-c1' as col1, 'row3-c2' as col2, 'row3-c3' as col3
UNION SELECT 'row4-c1' as col1, 'row4-c2' as col2, 'row4-c3' as col3
UNION SELECT 'row5-c1' as col1, 'row5-c2' as col2, 'row5-c3' as col3) as F
FOR XML RAW('tr'), ELEMENTS, TYPE
) AS 'tbody',
(SELECT '-' as th, 'sum' AS th, 'twenty' AS th FOR XML raw('tr'),ELEMENTS, TYPE) AS 'tfoot'
FOR XML PATH(''), ROOT('table')
Dưới đây là đầu ra HTML được tạo từ truy vấn mẫu
<table><caption>Sample Query to Generate HTML</caption>
<thead>
<tr>
<th>column-1</th>
<th>column-2</th>
<th>column-3</th>
</tr>
</thead>
<tbody>
<tr>
<td>row1-c1</td>
<td>row1-c2</td>
<td>row1-c3</td>
</tr>
<tr>
<td>row2-c1</td>
<td>row2-c2</td>
<td>row2-c3</td>
</tr>
<tr>
<td>row3-c1</td>
<td>row3-c2</td>
<td>row3-c3</td>
</tr>
<tr>
<td>row4-c1</td>
<td>row4-c2</td>
<td>row4-c3</td>
</tr>
<tr>
<td>row5-c1</td>
<td>row5-c2</td>
<td>row5-c3</td>
</tr>
</tbody>
<tfoot>
<tr>
<th>-</th>
<th>sum</th>
<th>twenty</th>
</tr>
</tfoot>
</table>
Khi điều này được đặt trong tệp HTML, với CSS phù hợp, nó có thể trông giống như thế này
Sử dụng cơ sở dữ liệu AdventureWorks cho các ví dụ dưới đây
Ví dụ 1:
Bây giờ chúng tôi có thể sản xuất một bảng báo cáo về số lượng doanh số cho mỗi thành phố, cho ba mươi thành phố hàng đầu.
SELECT CONVERT(NVARCHAR(MAX),(SELECT
(SELECT 'Top Thirty Sales per City' FOR XML PATH(''), TYPE) AS 'caption',
(SELECT 'Sales' AS th, 'City' AS th FOR XML RAW('tr'), ELEMENTS, TYPE) AS 'thead',
(SELECT TOP 30 COUNT(*) AS td,
a.City + ', ' + sp.Name + ', ' + cr.Name AS td
FROM Sales.SalesOrderHeader AS soh
JOIN Person.Address AS a
ON a.AddressID = soh.BillToAddressID
JOIN Person.StateProvince AS sp
ON sp.StateProvinceID = a.StateProvinceID
JOIN Person.CountryRegion AS cr
ON cr.CountryRegionCode = sp.CountryRegionCode
GROUP BY a.City + ', ' + sp.Name + ', ' + cr.Name
ORDER BY COUNT(*) DESC
FOR XML RAW('tr'), ELEMENTS, TYPE
) AS 'tbody'
FOR XML PATH(''), ROOT('table')));
Ví dụ - 2:
Nếu bạn muốn làm nổi bật các ô cụ thể, dựa trên một thuộc tính từ dữ liệu hoặc giá trị. Chúng tôi có thể thêm, ví dụ, các thuộc tính lớp hoặc bất cứ thứ gì bạn cần nhưng bạn hy sinh sự đơn giản của XML RAW. Bạn sẽ cần sử dụng cho đường dẫn XML
Điều này cho phép bạn chỉ định các thuộc tính. Tuy nhiên, vì bạn đang chỉ định đường dẫn trong mệnh đề AS, tất cả các tên TD liên tục của bạn sẽ được nối thành một phần tử TD trừ khi bạn sử dụng hack để cho biết rằng chúng là riêng biệt.
SELECT CONVERT(NVARCHAR(MAX),(SELECT
(SELECT 'Top Thirty Sales per City ('+CONVERT(CHAR(11),GETDATE(),113)+')' FOR XML PATH(''), TYPE) AS 'caption',
(SELECT 'rank' AS th, 'Sales' AS th, 'City' AS th FOR XML RAW('tr'), ELEMENTS, TYPE) AS 'thead',
(SELECT TOP 30
CASE WHEN COUNT(*)>400 THEN 'TextRed'
WHEN COUNT(*)>250 THEN 'TextMauve'
ELSE 'TextBlue'END AS [td/@class],
RANK() OVER (ORDER BY COUNT(*) desc) AS td ,
'' AS [*],--hack to allow the use of PATH
COUNT(*) AS td,--PATH otherwise concatenates TDs
'' AS [*],--hack to allow the use of PATH
a.City + ', ' + sp.Name + ', ' + cr.Name AS td
FROM Sales.SalesOrderHeader AS soh
JOIN Person.Address AS a
ON a.AddressID = soh.BillToAddressID
JOIN Person.StateProvince AS sp
ON sp.StateProvinceID = a.StateProvinceID
JOIN Person.CountryRegion AS cr
ON cr.CountryRegionCode = sp.CountryRegionCode
GROUP BY a.City + ', ' + sp.Name + ', ' + cr.Name
ORDER BY COUNT(*) DESC
FOR XML PATH('tr'), ELEMENTS, TYPE
) AS 'tbody'
FOR XML PATH(''), ROOT('table')));
Tạo danh sách phân cấp từ các truy vấn SQL.
Danh sách HTML có lẽ là cách hữu ích nhất để truyền dữ liệu phân cấp đơn giản cho một ứng dụng. Bạn thực sự có thể sử dụng các thư mục (DLS) để thực hiện việc này cho các cặp giá trị tên danh sách và thậm chí các bảng cho dữ liệu phức tạp hơn. Dưới đây là một ví dụ đơn giản về một danh sách phân cấp, được tạo ra từ AdventureWorks. Bạn muốn sử dụng một chức năng đệ quy cho bất cứ điều gì phức tạp hơn. Tôi sẽ cho bạn thấy điều này trong một khoảnh khắc. Đây là một phiên bản đơn giản chỉ cung cấp cho bạn một cấp độ
SELECT CONVERT( NVARCHAR(MAX),(SELECT f.[Group] AS li,
(SELECT g.Name AS li
FROM Sales.SalesTerritory g
WHERE g.[Group] = f.[Group]
FOR XML RAW(''), ROOT('ul'), ELEMENTS, TYPE
)
FROM Sales.SalesTerritory f
GROUP BY f.[Group]
FOR XML RAW(''), ROOT('ul'), ELEMENTS, TYPE
)
);
Đối với bất kỳ truy vấn & đề xuất nào, hãy gửi cho tôi @.
Tham khảo từ việc tạo HTML từ các truy vấn máy chủ SQL
Cảm ơn bạn! :)