删除sp_send_dbmail中的额外空格

时间:2017-12-06 08:03:05

标签: sql-server sql-server-2005 sp-send-dbmail

我有下表:

CREATE TABLE [dbo].[MyTable](
    [Day_ID] [nvarchar](50) NULL,
    [SAS] [nvarchar](50) NULL,
    [STAMP] [datetime] NULL DEFAULT (getdate())
)

包含此数据:

  • '2017_12_06_01', '红'
  • '2017_12_06_02', '黄色'
  • '2017_12_06_03', '绿'
  • '2017_12_06_04', '蓝'

我还有一个SP,它读取MyTable中的所有数据并将其发送到电子邮件正文中。

SET NOCOUNT ON;

    EXEC msdb.dbo.sp_send_dbmail 
        @profile_name = 'MyMailProfile'
        ,@recipients = 'me@account.com'
        ,@subject = 'This is the object'
        ,@body = 'This is the body:'
        ,@body_format = 'TEXT'
        ,@query = 'SET NOCOUNT ON select [Day_ID],[SAS] from MyTable SET NOCOUNT OFF'
        ,@attach_query_result_as_file = 0
        ,@query_result_separator = '|'
        ,@exclude_query_output = 1
        ,@query_result_no_padding = 0
        ,@query_result_header = 0
        ,@append_query_error=1

一切正常但我的问题是在体内结果如下:

2017_12_06_01                                   |Red                                                  
2017_12_06_02                                   |Yellow                                               
2017_12_06_03                                   |Green                                                
2017_12_06_04                                   |Blue                                                 

换句话说,SQL Server知道列的长度可以是50个字符,因此它们填充的空格不包含带空格的字符。如果您认为如果将数值写入列中也会发生这种情况(例如,NUMERIC),这非常无聊。 我尝试过使用LTRIM和RTRIM,但没有任何改变。

我正在使用SQL Server 2005。

2 个答案:

答案 0 :(得分:2)

参数@query_result_no_padding应该允许您这样做。

从以下位置更改:

@query_result_no_padding = 0

@query_result_no_padding = 1
  

[@q​​uery_result_no_padding] @query_result_no_padding类型为bit。   默认值为0.设置为1时,查询结果不会填充,   可能会减小文件大小。如果将@query_result_no_padding设置为   1,你设置@query_result_width参数,   @query_result_no_padding参数会覆盖@query_result_width   参数。 +在这种情况下不会发生错误。如果你设置了   @query_result_no_padding为1并设置@query_no_truncate   参数,引发错误。

来源:https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-send-dbmail-transact-sql

答案 1 :(得分:1)

您需要运行两个查询 - 首先计算实际长度,第二个检索电子邮件的数据。显然,这可能会有很高的成本。

类似的东西:

declare @maxDay int
declare @maxSAS int

select @maxDay = MAX(LEN(RTRIM(Day_ID))),@maxSAS = MAX(LEN(RTRIM(SAS))) from MyTable

declare @sql varchar(max)
set @sql = 'SET NOCOUNT ON select CONVERT(nvarchar(' + CONVERT(varchar(10),@maxDay) +
           '),[Day_ID]) as Day_ID,CONVERT(nvarchar(' + CONVERT(varchar(10),@maxSAS) +
           '),[SAS]) as SAS from MyTable SET NOCOUNT OFF'

然后在@sql电话中使用sp_send_dbmail

  

我尝试过使用LTRIM和RTRIM,但没有任何改变。

不会。结果集中的每列都有一个固定类型。您的输入RTRIM()来电是nvarchar(50)。在不知道所有行的内容的情况下,SQL Server可以使用表达式为RTRIM()的输出派生什么样的数据类型?它仍然只能是nvarchar(50),因此它仍然是结果集中列的类型。对于所有服务器的新功能,可能会有一行包含50个非空白字符,结果仍然需要显示。