2013-04-21 2 views
0

Я создаю хранимую процедуру для создания нового клиента так, например,хранимые процедуры - Зная следующий ID

CREATE PROCEDURE Customer_Create 
@customer_arg 
@type_arg 
AS 
BEGIN 
INSERT INTO Customer (Customer_id, Type_id) 
VALUES (@Customer_arg,@type_arg) 
End; 

Если у меня есть несколько внешних ключей в моем заявлении, и все они идентификаторы есть способ для того, чтобы я автоматически удалял идентификационный номер NEXT, не зная, что будет с моей головы, когда я запустим инструкцию execute? Я хотел бы просто иметь его вытащить тот факт, что ID будет 2, потому что предыдущий рекорд был 1

EXECUTE Customer_Create 16,2 

Является ли это что-то wnith output? Если да, то как это работает, код wise

+0

Вы используете [ IDENTITY] (http://msdn.microsoft.com/en-us/library/ms186775.aspx) в вашем идентификаторе? Если нет, это ваша проблема. Вы должны позволить базе данных генерировать новые значения. Как объясняют ответы, 'Scope_Identity()' может возвращать вновь назначенное значение идентичности в простых случаях, подобных этому, но oyu должен узнать о предложении 'OUTPUT', поскольку он намного полезнее. Стоит отметить, что назначенные значения могут быть не плотными. Например, если несколько строк вставляются во время транзакции и транзакция затем откатывается, значения id не будут повторно использоваться. – HABO

ответ

1

Я подозреваю, что то, что вы хотите сделать, это return новый идентификатор после внесения записи. Для этого:

CREATE PROCEDURE Customer_Create (
    @customer_arg, 
    @type_arg, 
    @NewCustomerId int output 
) AS 
BEGIN 
    INSERT INTO Customer(Customer_id, Type_id) 
     VALUES (@Customer_arg, @type_arg); 

    @NewCustomerId = scope_identity(); 
End; 

Есть несколько других вариантов для получения идентичности, которые объясняются here.

+0

'scope_identity()' может - в редких случаях - вернуть неправильное значение. Вы должны использовать предложение OUTPUT, чтобы получить последнее значение IDENTITY. (См. Мой ответ для ссылки на более подробную информацию.) –

1

Чтобы добраться до последнего вставленного значения IDENTITY вы должны использовать предложение OUTPUT так:

DECLARE @IdentValues TABLE(v INT); 

INSERT INTO dbo.IdentityTest 
OUTPUT INSERTED.id INTO @IdentValues(v) 
DEFAULT VALUES; 

SELECT v AS IdentityValues FROM @IdentValues; 

Есть несколько других механизмов, как @@IDENTITY, но все они имеют серьезные проблемы. См. Мою статью Identity Crisis.

+0

Я новичок в этом материале ... Я до сих пор не понимаю, что вы говорите ... если я хочу «вывести», я делаю 'OUTPUT INSERTED.Type_ID' ? Как он обращается к этой таблице, чтобы получить то, что было последним, и добавить перемещение до следующего значения? – user168403

+0

У вас есть сек для чата? – user168403

0

В вашем случае вы можете также экспериментировать с @IDENTITY как этот

DECLARE @NextID int 
--insert statement goes here 
SET @NextID = @@Identity` 

Здесь есть пара хороших ресурсов для ознакомления с этим

http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

http://blog.sqlauthority.com/2013/03/26/sql-server-identity-fields-review-sql-queries-2012-joes-2-pros-volume-2-the-sql-query-techniques-tutorial-for-sql-server-2012/

+0

'@@ Identity' убивает котят. 'Scope_Identity()' и 'OUTPUT' гораздо чаще возвращают нужные вам значения, независимо от триггеров. – HABO

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