如何更改 SQL 脚本以使具有金额的列右对齐
Posted
技术标签:
【中文标题】如何更改 SQL 脚本以使具有金额的列右对齐【英文标题】:how to change the SQL script so that the columns with the amount are right-aligned 【发布时间】:2022-01-09 02:52:40 【问题描述】:请帮我更改请求,使金额列右对齐?它们被标记为“钱”。我将使用动态 SQL,因此字段会发生变化。对我来说重要的是,任何没有用钱标签标记的字段都向右移动,其他所有内容都居中。 我正在使用这个脚本。以下是我期望的结果。
insert into #a
Values (1, 'GB', 2000),
(2, 'DE', 170),
(3, 'PT', 960)
DECLARE @Values NVARCHAR(MAX)
select @Values = CAST((SELECT ROW_NUMBER() OVER(ORDER BY UserID) AS 'td','',
(SELECT CONCAT('https://backend.com/User/UserDetails.aspx?UserID=',UserId) AS [@href],UserID FOR XML PATH('a'),TYPE) AS 'td',''
,Country AS 'td',''
,TotalDeposits AS 'money',''
FROM #a
FOR XML PATH('tr'),ELEMENTS ) AS NVARCHAR(MAX))
select '<html><body><table border=1 cellpadding=10 style="border-collapse:collapse;">' + + @Values + '</table></body></html>'
<html>
<body>
<table border=1 cellpadding=10 style="border-collapse:collapse;">
<tr align="center" valign="center">
<td>1</td>
<td>
<a href="https://backend.com/User/UserDetails.aspx?UserID=1">
<UserID>1</UserID>
</a>
</td>
<td>GB</td>
<td style="text-align:right;vertical-align:middle;">2000</td>
</tr>
<tr align="center" valign="center">
<td>2</td>
<td>
<a href="https://backend.com/User/UserDetails.aspx?UserID=2">
<UserID>2</UserID>
</a>
</td>
<td>DE</td>
<td style="text-align:right;vertical-align:middle;">170</td>
</tr>
<tr align="center" valign="center">
<td>3</td>
<td>
<a href="https://backend.com/User/UserDetails.aspx?UserID=3">
<UserID>3</UserID>
</a>
</td>
<td>PT</td>
<td style="text-align:right;vertical-align:middle;">960</td>
</tr>
</table>
</body>
</html>
【问题讨论】:
老实说,这听起来您应该使用实际的应用程序来生成电子邮件,而不是 SQL Server。 dbfiddle.uk/… 【参考方案1】:这对 XQuery 来说是一件容易的事。
好处:
没有字符串连接。 不用担心 NULL 值。 非常容易创建,非常容易维护。 UI 样式通过 CSS 控制。SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (UserID INT PRIMARY KEY, Country CHAR(2), TotalDeposits MONEY, IsMoney BIT);
INSERT INTO @tbl (UserID, Country, TotalDeposits, IsMoney) VALUES
(1, 'GB', 2000, 0),
(2, 'DE', 170, 1),
(3, 'PT', 960, 0)
-- DDL and sample data population, end
DECLARE @xhtmlBody XML
, @body NVARCHAR(MAX)
, @tableCaption VARCHAR(30) = 'Users list';
SET @xhtmlBody = (SELECT (
SELECT * FROM @tbl FOR XML PATH('row'), TYPE, ROOT('root'))
.query('<html><head>
<meta charset="utf-8"/>
(: including embedded CSS styling :)
<style>
table <![CDATA[ border-collapse: collapse; width: 300px; ]]>
th <![CDATA[ background-color: #4CAF50; color: white; ]]>
th, td <![CDATA[ text-align: left; padding: 8px; ]]>
tr:nth-child(even) <![CDATA[ background-color: #f2f2f2; ]]>
#green <![CDATA[ background-color: lightgreen; ]]>
</style>
</head>
<body>
<table border="1" cellpadding="10" style="border-collapse:collapse;">
<caption><h2>sql:variable("@tableCaption")</h2></caption>
<thead>
<tr>
<th>No.</th>
<th>UserID</th>
<th>Country</th>
<th>TotalDeposits</th>
</tr>
</thead>
<tbody>
for $row in /root/row
let $pos := count(root/row[. << $row]) + 1
return <tr align="center" valign="center">
<td>$pos</td>
<td><a href="concat(''https://backend.com/User/UserDetails.aspx?UserID='',data($row/UserID[1]))">
<UserID>data($row/UserID)</UserID>
</a></td>
<td>data($row/Country)</td>
<td style="concat(if (data($row/IsMoney="1")) then "text-align:right;"
else "text-align:left;", "vertical-align:middle;")">data($row/TotalDeposits)</td>
</tr>
</tbody></table></body></html>'));
SELECT @xhtmlBody;
SET @body = CAST(@xhtmlBody AS NVARCHAR(MAX));
输出
<html>
<head>
<meta charset="utf-8" />
<style>
table border-collapse: collapse; width: 300px;
th background-color: #4CAF50; color: white;
th, td text-align: left; padding: 8px;
tr:nth-child(even) background-color: #f2f2f2;
#green background-color: lightgreen;
</style>
</head>
<body>
<table border="1" cellpadding="10" style="border-collapse:collapse;">
<caption>
<h2>Users list</h2>
</caption>
<thead>
<tr>
<th>No.</th>
<th>UserID</th>
<th>Country</th>
<th>TotalDeposits</th>
</tr>
</thead>
<tbody>
<tr align="center" valign="center">
<td>1</td>
<td>
<a href="https://backend.com/User/UserDetails.aspx?UserID=1">
<UserID>1</UserID>
</a>
</td>
<td>GB</td>
<td style="text-align:left;vertical-align:middle;">2000.0000</td>
</tr>
<tr align="center" valign="center">
<td>2</td>
<td>
<a href="https://backend.com/User/UserDetails.aspx?UserID=2">
<UserID>2</UserID>
</a>
</td>
<td>DE</td>
<td style="text-align:right;vertical-align:middle;">170.0000</td>
</tr>
<tr align="center" valign="center">
<td>3</td>
<td>
<a href="https://backend.com/User/UserDetails.aspx?UserID=3">
<UserID>3</UserID>
</a>
</td>
<td>PT</td>
<td style="text-align:left;vertical-align:middle;">960.0000</td>
</tr>
</tbody>
</table>
</body>
</html>
【讨论】:
非常简洁的方法。它与哪个版本的 SQL Server 兼容? 非常感谢!如果我每次都需要@tbl 表中的不同字段,我可以将它与动态 SQL 一起使用吗? @ThomasDoconski,XQuery 从 SQL Server 2005 开始可用。 @Zorge17,您始终可以使用动态 SQL。只是它需要一些修补。但 XQuery 将强制执行正确的 (X)HTML。 @YitzhakKhabinsky,我正在使用您的解决方案,它对我帮助很大。关于用灰色填充每一偶数行的一个问题(tr:nth-child(even) background-color: #f2f2f2; )。当我将输出粘贴到记事本中时,这个填充就在那里,但是当我从 SQL 服务器 msdb.dbo.sp_send_dbmail 发送邮件时,它就消失了。你知道这可能与什么有关吗?以上是关于如何更改 SQL 脚本以使具有金额的列右对齐的主要内容,如果未能解决你的问题,请参考以下文章
如何在两个图表ggplot 2上对齐y轴,以使它们具有相同的范围和增量