【问题标题】:Concatenate a parameter value with a string将参数值与字符串连接起来
【发布时间】:2020-09-25 19:54:44
【问题描述】:

我使用的是 SQL Server 2017。我的代码适用于我的应用。但是,我想用一些文本/字符串发送参数值。我尝试了许多格式来组合或连接两者。我试过这个
@body = @AssociateTaskID + '你已经被分配了这个id'; 也试过这个@body = @AssociateTaskID + + '你已经被分配了这个id'; 两者都有语法错误。有什么办法可以做到这一点并使其发挥作用吗?如果有,语法是什么?

   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;

【问题讨论】:

  • 你得到哪个错误?
  • 你没有告诉我们那些语法错误是什么。 SET @Variable = @Variable + ' Some String'; 是完全有效的语法。
  • 另外,这看起来像是触发器的一部分。如果是这样,那就是致命的缺陷;它假定 DML 语句影响 one 行;那不是真的。此外,从触发器发送电子邮件是个坏主意。将数据放入一个池表中,然后使用计划任务从那里通过电子邮件发送数据。
  • 它是触发器的一部分 - 这是上一个问题,它被适当地指出这种方法非常有缺陷。
  • “我已经看到这样做没有产生负面问题” 显着的性能下降不是负面问题吗?

标签: sql sql-server sql-server-2017


【解决方案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;

【讨论】:

  • 完全没有性能问题。这个用户组永远不会增长到超过 75 个用户,并且只有一个应用程序在运行。我们已经用 70 多条记录对此进行了测试,并且每次都更新了正确的记录。它实际上就像我们希望它执行的那样工作。这没有任何问题。
  • Steve C 的以下内容运行良好。只需运行代码,它就可以完美地发送带有 id 和字符串信息的消息。感谢您的输入。 select @Message=concat(cast(@AssociateTaskID as nvarchar(12)), N'你已经被分配了这个id'); --if update(TaskAction_A1_assigned)
  • 哈,没有理想的系统(包括我的)。如果它满足要求并且您了解每个部分,那么它就是一个很棒的系统。 :) 很高兴它有帮助!
【解决方案2】:

您可能需要将此int 转换为字符串。 concat() 因其隐式字符串转换功能而派上用场:

@body = concat('You have been assigned this task: ', @AssociateTaskID);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多