Я пытаюсь отправить электронное письмо через SQL Server. Все работает, однако я не могу заставить @body принимать переменные, которые я объявляю.
Я также попытался вызвать новую переменную и установить ее для @body, но столкнулся с той же проблемой.
Declare @Body varchar(max),
@TableHead varchar(max),
@TableTail varchar(max),
@message as varchar(max)
Set @message=
(
DECLARE @CNT as int, @SLS as NVARCHAR(10)
select [employeeid], [Sales]
into #loctempemployee from tblEmployees
Set @CNT = (Select COUNT (Distinct EmployeeID) from #loctempemployee)
SELECT tr.Principal As [TD], tr.[Company Name] As [TD], ai.[Action Item] As [TD], ai.Owners As [TD], ai.[Due Date] As [TD], ai.Updated As [TD]
FROM [tblActionItem] ai
INNER JOIN tblTripReport tr ON ai.TripReportID = tr.tripreportID
INNER JOIN tblCustomers cu ON cu.CustomerID = tr.[Customer ID]
INNER JOIN tblEmployees em ON em.EmployeeID = cu.EmployeeID
WHERE em.Sales = (Select sales from #loctempemployee Where EmployeeID = (Select top 1 EmployeeID from #loctempemployee))
For XML raw('tr'), Elements
Delete #loctempemployee Where EmployeeID = (Select top 1 EmployeeID from #loctempemployee)
set @CNT = @CNT -1;
End
drop table #loctempemployee
)
Select @Body = (@message)
@squillman говорит, что в строке объявления неправильный синтаксис. Я где-то читал, что вы не можете объявлять переменные в теле письма для сервера sql.
@GSerg, когда я говорю, что все работает, когда я запускаю каждую часть кода отдельно, он работает нормально и возвращает результаты, которые я ищу. Но когда я объединяю все это вместе и пытаюсь поместить в формат электронной почты, это не скомпилируется. Я не добавлял все, потому что весь остальной код работает нормально.
Вы не можете установить переменную как оператор T-SQL (если только вы не заключите этот оператор в кавычки, но это просто строка). Чего вы на самом деле пытаетесь достичь здесь? Динамический SQL?
Нет никаких шансов, что это сработает. Весь тот фрагмент, где вы устанавливаете @message, — это полная авария. Это совсем не то, как работает t-sql. Вы не можете установить переменную для целого блока кода.
I read somewhere — мог ли это быть документация для sp_send_dbmail? Хотя правильно, что вы не можете ссылаться на локально объявленные переменные внутри запроса, который вы передаете для @query, вы даже не пытаетесь это сделать. Вы пытаетесь присвоить блок команд локальной переменной, что не имеет смысла независимо от dbmail.
Итак, изначально у меня был оператор select в качестве @body их электронной почты, а код запускается и компилируется. Но затем я хотел добавить некоторую логику в одно из полей в операторе выбора, где он будет создавать временную таблицу и циклически проходить эту временную таблицу по строкам и заменять это поле из поля временной таблицы. Есть ли способ объединить логику и оператор select в тело?


комментарии вполне правильные - вы не можете выполнить огромный блок SQL в присваивании переменной одному типу данных.
Если вы получаете нужные данные в таблицу #temp, вы можете использовать что-то вроде следующего.
DECLARE @xml VARCHAR(MAX);
SET @xml = CAST(( SELECT [col1] AS 'td','',[col2] AS 'td','', [col3] AS 'td'
FROM #temptable
FOR XML PATH('tr'), ELEMENTS ) AS NVARCHAR(MAX))
SET @body ='<html><body><H3>(Report Title)</H3>
<table border = 1>
<tr>
<th> Col1 </th> <th> Col2 </th> <th> Col3 </th>'
SET @body = @body + @xml + '</table></body></html>'
-- mail out contents
EXEC msdb.dbo.sp_send_dbmail @recipients = @emailaddress,
@body = @body,
@body_format = 'HTML',
@subject = 'SomeReport',
@profile_name = 'SomeProfileName';
Если я вас правильно понял, вы пытаетесь присвоить результат SELECT@message. Синтаксис, который вы используете, неверен. Вы не можете запустить пакет операторов в SET, как в TSQL. Вы можете назначить @message результаты запроса, если ваш запрос дает строковый результат. Итак, я думаю, вы, вероятно, захотите изменить свой код, чтобы он был примерно таким (вытягивая другие операторы из вашего оператора SET).
Declare @Body varchar(max),
@TableHead varchar(max),
@TableTail varchar(max),
@message as varchar(max);
DECLARE @CNT as int, @SLS as NVARCHAR(10);
select [employeeid], [Sales]
into #loctempemployee from tblEmployees;
Set @CNT = (Select COUNT (Distinct EmployeeID) from #loctempemployee);
Set @message=
(
SELECT tr.Principal As [TD], tr.[Company Name] As [TD], ai.[Action Item] As [TD], ai.Owners As [TD], ai.[Due Date] As [TD], ai.Updated As [TD]
FROM [tblActionItem] ai
INNER JOIN tblTripReport tr ON ai.TripReportID = tr.tripreportID
INNER JOIN tblCustomers cu ON cu.CustomerID = tr.[Customer ID]
INNER JOIN tblEmployees em ON em.EmployeeID = cu.EmployeeID
WHERE em.Sales = (Select sales from #loctempemployee Where EmployeeID = (Select top 1 EmployeeID from #loctempemployee))
For XML raw('tr'), Elements
);
Delete #loctempemployee Where EmployeeID = (Select top 1 EmployeeID from #loctempemployee);
set @CNT = @CNT -1;
drop table #loctempemployee;
Select @Body = (@message);
Кроме того, вы делаете это в цикле, который не показываете? Существует END, у которого нет соответствующего BEGIN, и это также объясняет строку set @CNT = @CNT -1;.
Everything is working- Мне трудно в это поверить. Этот код не имеет смысла и не будет компилироваться. Чего вы пытаетесь достичь?