2013-10-15 14 views
0

У меня есть этот запрос, который не запускается корректно, но это показывает, что я пытаюсь достичь:Выберите идентификатор @@ при вставке?

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

Я хотел бы получить последнее вставленное значение, полученное с помощью этой вставки заявления и передать его где выход Поставлен .UserID есть. Как это можно сделать?

Я могу сделать это в два этапа, выбрав @@ identity после вставки, а затем обновить столбец пароля в таблице. Но я хотел бы сделать это за один раз, если это вообще возможно.

Мое шифрование основано на этой статье от Microsoft. http://technet.microsoft.com/en-us/library/ms179331.aspx Спасибо.

+0

О хранимых процедурах, они помогут вам –

+0

Я бы рекомендовал использовать ** 'SCOPE_IDENTITY()' ** вместо всего остального, чтобы захватить вновь вставленное значение удостоверения личности. [См. Это сообщение в блоге для объяснения относительно WHY] (http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity -of-record /) –

+0

Marc_s, получение идентификатора области не является моей единственной целью. Я хочу получить его во время вставки. Я попробовал scope_identity, где теперь находится Output Inserted.UserID. Это не работает. Спасибо, в любом случае. – loveprogramming

ответ

1

Предложение OUTPUT не содержит данных для Inserted. * До тех пор, пока не произошла вставка. Сначала вам нужно выполнить вставку. Если вы попытаетесь обойти это, вложив INSERT в запрос UPDATE или MERGE, SQL предоставит ошибку, которая также не поддерживает это.

Один из вариантов - это @@, как вы говорите. Другим является рассмотрение использования объекта SEQUENCE для определения UserID. Его преимуществом в этом случае является то, что вы можете создать UserID до вставки, и точно так же, как IDENTITY, нет конфликта.

+0

Nicholai, просто для подтверждения. Значит, вы говорите, что мне нужно сделать это за два шага? Первая вставка затем обновляется? Я пробовал, и этот тип решения работает. Проблема в том, что мне нужно отметить мой столбец password_encrypt как обнуляемый, пока он фактически не может быть нулевым. – loveprogramming

+0

Это правильно. Идентичность не существует до тех пор, пока строка не будет записана. Я рекомендую либо использовать объект Sequence, либо устанавливать временный пароль во время вставки, а затем обновлять его на втором шаге. – Nicholai

Смежные вопросы