插入可能时选择@@ identity?

时间:2013-10-15 01:15:15

标签: sql sql-server stored-procedures

我有这个查询无法正常运行,但它显示了我想要实现的目标:

INSERT INTO Table1
    (first_name, last_name, email, password_encrypt)

    VALUES
    (
    @first_name,@last_name,@email,
    EncryptByKey(Key_GUID('CertificateName'), @password_encrypt, 1, HashBytes('SHA1', CONVERT( varbinary, Output Inserted.UserID)))
    )

我想获取此insert语句生成的最后一个插入值,并将其传递给Output Inserted.UserID所在的位置。怎么办?

我可以通过在插入后选择@@ identity然后更新表中的密码列,分两步完成此操作。但如果可能的话,我很乐意一气呵成。

我的加密基于Microsoft的这篇文章。 http://technet.microsoft.com/en-us/library/ms179331.aspx 谢谢。

1 个答案:

答案 0 :(得分:1)

在插入发生之前,OUTPUT子句没有Inserted。*的任何数据。您必须先执行插入。如果您尝试通过将INSERT嵌套到UPDATE或MERGE查询来解决此问题,SQL将给出一个它也不支持的错误。

一个选项是@@ identity,就像你说的那样。另一种方法是考虑使用SEQUENCE对象来定义UserID。在这种情况下,它的优势在于您可以在插入之前生成UserID,就像IDENTITY一样,不存在冲突的可能性。