我有下表:
CREATE TABLE [dbo].[MyTable](
[Day_ID] [nvarchar](50) NULL,
[SAS] [nvarchar](50) NULL,
[STAMP] [datetime] NULL DEFAULT (getdate())
)
包含此数据:
我还有一个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。
答案 0 :(得分:2)
参数@query_result_no_padding
应该允许您这样做。
从以下位置更改:
@query_result_no_padding = 0
到
@query_result_no_padding = 1
[@query_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 参数,引发错误。
答案 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个非空白字符,结果仍然需要显示。