2012-03-04 4 views
14

Я попытался написать хранимую процедуру, которая сначала вставляет новую запись в таблицу, а затем возвращает идентификатор этой новой записи. Я не уверен, что это правильный путь и лучший способ достичь этого.Нужна хранимая процедура, которая вставляет строку и возвращает ID

ALTER PROCEDURE dbo.spAddAsset 
(
@Name VARCHAR(500), 
@URL VARCHAR(2000) 
) 
AS 
BEGIN 
Set NOCOUNT on; 

Insert Into Assets (Name, URL) Values (@Name, @URL) 

Declare @new_identity int; 

SELECT @new_identity = SCOPE_IDENTITY() 

return @new_identity; 
END 
+0

Извините. Я проголосую за остальных. –

ответ

27

Чтобы вернуть одно значение скалярной вызывающему абоненту следует использовать OUTPUT параметр, а не RETURN. RETURN для кодов ошибок/состояний. Также префикс sp является избыточным и ненужным.

CREATE PROCEDURE dbo.AddAsset 
    @Name VARCHAR(500), 
    @URL VARCHAR(2000), 
    @new_identity INT = NULL OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT dbo.Assets(Name, URL) SELECT @Name, @URL; 
    SET @new_identity = SCOPE_IDENTITY(); 
END 
GO 

Тогда назвать:

DECLARE @new_identity INT; 
EXEC dbo.AddAsset @Name = 'a', @URL = 'b', @new_identity = @new_identity OUTPUT; 
PRINT @new_identity; 

EDIT просто добавить отказ от ответственности, которая не будет влиять на Аскер в этом конкретном случае, но может помочь в других сценариях или для будущих читателей. В SQL Server 2008 R2 и ранее существует potentially nasty bug со встроенными функциями, такими как SCOPE_IDENTITY, когда для получения результатов необходимо ввести параллелизм (подумайте INSERT FROM othertable). Эта ошибка (here is the Connect item) исправлена ​​в Cumulative Update #5 for SQL Server 2008 R2 SP1, но до сих пор исправление не появилось в 2008 R2 RTM, 2008 или 2005.

+0

привет, как мне вернуть набор нескольких записей, которые я добавил (у меня есть XML в качестве источника ввода)? – godblessstrawberry

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