我有下表:
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字符的行,结果仍然需要显示。