如何更改 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 脚本以使具有金额的列右对齐的主要内容,如果未能解决你的问题,请参考以下文章

如何使特定的 Grocery CRUD 表列右对齐?

如何更改自动生成的列文本对齐方式

如何对齐页面中心的列? [复制]

如何在两个图表ggplot 2上对齐y轴,以使它们具有相同的范围和增量

在 WPF 和 XAML 中,如何让行详细信息的列在跳过多个列后动态更改以在父行下对齐?

C# datagridview 最后一列右对齐