sp_send_dbmail - невозможно прикрепить результаты запроса - PullRequest
0 голосов
/ 02 марта 2019

Цель состоит в том, чтобы внедрить следующую процедуру в задание SQL Server 2008r2, которое будет отправлять текстовый файл с разделителями-запятыми, который может быть открыт в Excel не техническими пользователями.Файл должен иметь по 1 строке на запись, включать заголовки и не должен быть усечен или дополнен.В целом, на мой взгляд, это очень стандартный не специальный файл.

Однако я сталкиваюсь с несколькими конфликтующими проблемами:

  • Каждое отдельное поле в отдельной строке.Каждая строка дополняется до 256 символов с пробелами.Это делает файл практически непригодным для использования и слишком большим для отправки по электронной почте.Установка @ query_result_no_padding = 1 устраняет эту проблему.
  • Если каждая строка (включая запятые) превышает 256 символов, эта строка усекается и копируется в следующую строку.Установка @ query_no_truncate = 1 должна исправить это, но это выдает ошибку, когда @ query_result_no_padding = 1
  • После некоторых проб и ошибок я не могуНе думаю, что @query_no_truncate относится к заголовкам.Заголовки столбцов вставляются в несколько строк, и я в растерянности по этому поводу.Кажется, что ни одна из опций в документации здесь не применима.

Как получить это, чтобы вывести результаты запроса в стандартный текстовый файл, который можно открыть и отфильтровать в Excel?

    Exec msdb.dbo.sp_send_dbmail
      @profile_name='myserver',
      @reply_to='repliesgoto@here.com',
      @recipients='me@company.com',

      @subject='my subject line',
      @body=@HTMLbody,
      @body_format='html'

      @query='Select * from myserver.dbo.mytable',
      @attach_query_result_as_file = 1,
      @query_attachment_filename='x.txt',
      @query_result_header=1,
      @query_result_separator=',',
      @query_result_no_padding=1,
      --@query_result_width=300,
      --@query_no_truncate=1,

Моя основная документация для этого процесса:
https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-send-dbmail-transact-sql?view=sql-server-2017

1 Ответ

0 голосов
/ 03 марта 2019

Я почти уверен, что проблема заключается в типах данных CHAR в таблице, поскольку проблема не возникает с VARCHAR.

use tempdb
go
create table dbo.t1 (col1 char(10), col2 char(20));
go
insert into dbo.t1 values ('1', '1')
    , ('2', '2')
    , ('3', '3');
go
select quotename(col1), quotename(col2) from dbo.t1;
go

Результаты:

[1         ], [1                   ]
[2         ], [2                   ]
[3         ], [3                   ]

Теперь выполните следующее, но RTRIM столбцы:

EXEC msdb.dbo.sp_send_dbmail 
@profile_name = 'test'
, @recipients = 'x@x.com'
, @reply_to = 'x@x.com'
, @subject = 'test2'
, @body_format = 'HTML'
, @query = 'set nocount on; select rtrim(col1) as col1, rtrim(col2) as col2 from dbo.t1'
, @execute_query_database = 'tempdb'
, @attach_query_result_as_file = 1
, @query_attachment_filename='x.txt'
, @query_result_header=1
, @query_result_separator=',';

по электронной почте результаты вложенного файла:

col1,col2
----,----
1,1
2,2
3,3
...