【问题标题】:How to get the values of selected columns in an update如何在更新中获取选定列的值
【发布时间】:2022-01-21 08:05:13
【问题描述】:

我想做一个查询来更新和选择列,比如

UPDATE dbo.employees SET otp = $OTP
WHERE identification = $identity (SELECT mail,emp.id, emp.name FROM dbo.emails email
LEFT JOIN dbo.employees emp ON emp.id = email.employee 
WHERE emp.identification = $identity)

如何获取选定的列值

【问题讨论】:

  • 为什么要进行单个查询来更新和选择?
  • 试试OUTPUT 子句...
  • 我想更新数据库上的 otp 并发送一封关于所选邮件和姓名的电子邮件
  • @DaleK 当我分开查询时,我能够做到这一点。但我的主管要求我将这两个陈述结合起来。在 sql 中运行它会返回值,但我无法在 php 中执行此操作
  • DaleK 建议使用OUTPUT clause,这是发布的代码没有做的事情。你考虑过吗?

标签: php sql sql-server pdo sql-update


【解决方案1】:

如前所述,您可以使用OUTPUT 子句来实现此目的。

您的代码还有几个问题:

  • 必须参数化您的语句,否则您将面临危险的 SQL 注入。
  • 如果您只期望一行,则不需要循环结果。
  • LEFT JOIN 后跟 WHERE 在连接表的一个列上使其成为隐式 INNER JOIN
$OTP = generateOTP();
$sql = "
UPDATE emp
SET otp = @OTP
OUTPUT email.mail, inserted.name
FROM dbo.employees emp
INNER JOIN dbo.emails email ON emp.id = email.employee
WHERE emp.identification = @identity;
";
$stmt = $con->prepare($sql);
$stmt->bindParam('@identity', $identity);
$stmt->bindParam('@OTP', $OTP);
if($stmt->execute()) {
    $row = stsmt->fetch();
    $emailTo = $row['mail'];
    $name = $row['name'];
} else {
    // deal with errors
}

此代码仅适用于emailsemployees 一对一关系的情况。否则,您必须使用单独的SELECT

【讨论】:

  • 感谢它的工作,我删除了“@”并使用了一个?。
【解决方案2】:

你可以使用存储过程

create procedure spupdate_employees_mail
@OTP int,
@IDENT varchar(20)
AS BEGIN

UPDATE employees SET OTP=@OTP WHERE identification=@IDENT

SELECT mail,employees.id,employees.name from  emails
LEFT JOIN employees ON employees.id=emails.id
WHERE employees.identification=@IDENT
END

EXECUTE spupdate_employees_mail 1001,'mechanic'  

spupdate_employees_mail 带有两个参数(otp 为 int,标识为 varchar)。它将更新表-employess,然后在 LEFT JOIN 上从employees 和 emalis 表中获取数据

【讨论】:

    猜你喜欢
    • 2021-01-31
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2023-03-11
    • 2017-01-07
    • 1970-01-01
    • 2015-09-18
    • 2017-08-14
    相关资源
    最近更新 更多