Объединение значения параметра со строкой

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