删除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','Yellow'
  • '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个字符,因此它们填充不包含空格字符的空间。如果您认为如果将数字值写入列,例如数字,这也很无聊。我尝试了Ltrim和Rtrim,但没有任何改变。

我正在使用SQL Server2005。

参数@query_result_no_padding应该允许您执行此操作。

从:

更改它
@query_result_no_padding = 0

to

@query_result_no_padding = 1

[@query_result_no_padding] @query_result_no_padding类型是位。 默认值为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://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-send-dbmail-transact-transact-sql

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

类似:

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'

然后在您的sp_send_dbmail中使用@sql

我已经尝试了ltrim和rtrim,但没有任何改变。

不会。结果集中的每个列都有一个固定类型。您的输入RTRIM()调用是nvarchar(50)。不知道所有行的内容,SQL Server可以使用Expression从该RTRIM()的输出中得出哪些可能的数据类型?它仍然只能是nvarchar(50),因此仍然是结果集中的列的类型。对于所有服务器现在,可能有一个包含50个非Whitespace字符的行,结果仍然需要显示。

相关内容

  • 没有找到相关文章

最新更新