#sql #sql-server #sql-server-2017
#sql #sql-сервер #sql-server-2017
Вопрос:
Я использую SQL Server 2017. У меня есть код, который хорошо работает для того, к чему я его применяю. Однако я хотел бы отправить значение параметра с некоторым текстом / строкой. Я перепробовал много форматов для объединения или объединения двух. Я пробовал это
@body = @AssociateTaskID ‘вам был присвоен этот идентификатор’; также пробовал это @body = @AssociateTaskID ‘вам был присвоен этот идентификатор’; я получаю синтаксические ошибки в обоих. Есть ли какой-либо способ сделать это и заставить его работать? Если да, то каков синтаксис?
Begin
declare @AssociateTaskID int;
declare @TaskAction_A1_assigned varchar(50);
declare @TaskAction_A1_started varchar(100);
declare @TaskAsction_A1_completed varchar(100);
select @AssociateTaskID = s.AssociateTaskID from inserted s;
select @TaskAction_A1_assigned = s.TaskAction_A1_assigned from inserted s;
select @TaskAction_A1_started = s.TaskAction_A1_started from inserted s;
select @TaskAsction_A1_completed = s.TaskAsction_A1_completed from inserted s;
------Send notification to TaskAction_A1_owner
if update(TaskAction_A1_assigned)
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Echo System',
@recipients = 'sampleemailer2@gmail.com',
@subject = 'Echo System Notification',
@body = @AssociateTaskID;
Комментарии:
1. Какую ошибку вы получаете?
2. Вы не говорите нам, что это за синтаксическая ошибка.
SET @Variable = @Variable ' Some String';
это совершенно правильный синтаксис.3. Кроме того, это выглядит как часть триггера. Если это так, это фатально ошибочно; предполагается, что оператор DML воздействует на одну строку; это неверно. Кроме того, отправка электронной почты из триггера — плохая идея; поместите данные в таблицу объединения, а затем используйте запланированную задачу для отправки данных по электронной почте оттуда.
4. Это часть триггера — это был предыдущий вопрос, в котором было должным образом отмечено, что этот подход очень ошибочен.
5. «Я видел, как это делалось без возникновения негативных проблем» Значительное снижение производительности не является негативной проблемой?
Ответ №1:
Объединение может быть присвоено переменной. Что-то вроде этого
declare
@AssociateTaskID int,
@TaskAction_A1_assigned varchar(50),
@TaskAction_A1_started varchar(100),
@TaskAsction_A1_completed varchar(100),
@Message nvarchar(4000);
select @AssociateTaskID = s.AssociateTaskID,
@TaskAction_A1_assigned = s.TaskAction_A1_assigned,
@TaskAction_A1_started = s.TaskAction_A1_started,
@TaskAsction_A1_completed = s.TaskAsction_A1_completed
from inserted s;
select @Message=concat(cast(@AssociateTaskID as nvarchar(12)), N'you have been assigned this id');
--if update(TaskAction_A1_assigned)
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Echo System',
@recipients = 'sampleemailer2@gmail.com',
@subject = 'Echo System Notification',
@body = @Message;
Комментарии:
1. Никаких проблем с производительностью вообще. Эта группа пользователей никогда не будет превышать 75 пользователей, и запущено только одно приложение. Мы протестировали это с более чем 70 записями и каждый раз, когда обновляется правильная запись. На самом деле это работает именно так, как мы хотим, чтобы оно выполнялось. И это без каких-либо проблем.
2. Следующее от Стива Си сработало хорошо. Просто запустил код, и он отправил сообщение идеально с идентификатором и строковой информацией. Спасибо за ввод. выберите @Message=concat(приведение(@AssociateTaskID как nvarchar(12)), если вам присвоен этот идентификатор’); —если обновление(TaskAction_A1_assigned)
3. Ха, идеальной системы не существует (включая мою). Если он соответствует требованиям, и вы понимаете каждую деталь, то это отличная система. 🙂 Рад, что это помогло!
Ответ №2:
Вероятно, вам нужно превратить это int
в строку. concat()
удобно благодаря функции неявного преобразования строк:
@body = concat('You have been assigned this task: ', @AssociateTaskID);