Как упорядочить поля в блокноте, которые поступают из db_send_email

#sql-server #sendmessage

#sql-сервер #отправить сообщение

Вопрос:

У меня есть блокнот с ожидаемыми результатами…Но поля расположены неправильно.Один столбец поступает в одну строку, а другой — в другую аналогичную.Это выглядит не очень хорошо.Я слышал, что мы можем установить ширину столбца для результирующего набора.Пожалуйста, помогите мне с синтаксисом и примером.

Ответ №1:

Предполагая, что вы имеете в виду sp_send_dbmail процедуру отправки почты базы данных, но не db_send_email . В таком случае вы можете управлять своим форматом вывода следующим образом.

1. Установите ширину строки вывода на фиксированное значение.

 EXEC msdb.dbo.sp_send_dbmail
  @profile_name = 'Mailer',
  @recipients = 'undisclosed',
  @query = 'SELECT field_int
                 , field_varchar_50
                 , field_varchar_250
            FROM mytable' ,
  @query_result_no_padding = 0,
  @query_result_width = 400 ;
  

Выбранная ширина должна быть больше суммы длин всех полей в запросе, например, @query_result_width = 400 . Однако это приведет к образованию слишком широких строк, особенно в случае, если в varchar(50) или varchar(250) полях много пробелов.

2. Усеките поля.

 EXEC msdb.dbo.sp_send_dbmail
  @profile_name = 'Mailer',
  @recipients = 'undisclosed',
  @query = 'SELECT field_int
                 , LEFT(field_varchar_50, 25)
                 , LEFT(field_varchar_250, 25)
            FROM mytable' ,
  @query_result_no_padding = 0 ;
  

Это приведет к выводу, где varchar(50) или varchar(250) будет усечен до 25 символов. Конечно, вы можете использовать любое подходящее другое значение.

3. Отрегулируйте длину полей.

Просто добавьте вычисление длины поля и создайте вывод с точной шириной.

 DECLARE @iField_varchar_250_length
SELECT @iField_varchar_250_length = MAX(LEN(field_varchar_250)) FROM mytable

DECLARE @sQuery VARCHAR(200)
SELECT @sQuery = 'SELECT field_int
                       , LEFT(field_varchar_50, 25)
                       , LEFT(field_varchar_250, '   CAST(@iField_varchar_250_length AS VARCHAR(10))   ')
                  FROM mytable' ,

EXEC msdb.dbo.sp_send_dbmail
  @profile_name = 'Mailer',
  @recipients = 'undisclosed',
  @query = @sQuery,
  @query_result_no_padding = 0 ;