#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 ;