2012-03-04 7 views
14

Próbowałem napisać procedura składowana, która po raz pierwszy wstawia nowy rekord do tabeli, a następnie zwrócił identyfikator tego nowego rekordu. Nie jestem pewien, czy jest to właściwy sposób i najlepszy sposób, aby to osiągnąć.Potrzebuję procedura składowana wstawia wiersz i zwraca identyfikator

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

Przepraszamy. Będę głosować nad resztą. –

Odpowiedz

27

Aby powrócić pojedynczą wartość skalarną do rozmówcy należy użyć parametru OUTPUT, nie RETURN. RETURN służy do kodów błędów/statusu. Również przedrostek sp jest zbędny i niepotrzebny.

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 

Wtedy to nazwać:

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

EDIT wystarczy dodać zastrzeżenie, że nie wpłynie to na pytającego w tym konkretnym scenariuszu, ale może pomóc w innych sytuacjach lub dla przyszłych czytelników. W SQL Server 2008 R2 i wcześniejszych wersjach dostępna jest funkcja potentially nasty bug z wbudowanymi funkcjami, takimi jak SCOPE_IDENTITY, gdy do uzyskania wyników do wstawienia wykorzystywany jest paralelizm (pomyśl INSERT FROM othertable). Ten błąd (here is the Connect item) jest naprawiony w Cumulative Update #5 for SQL Server 2008 R2 SP1, ale jak dotąd poprawka nie pojawiła się w 2008 R2 RTM, 2008 lub 2005.

+0

hi, jak mogę zwrócić zestaw wielu rekordów, które dodałem (mam XML jako źródło wejściowe)? – godblessstrawberry

Powiązane problemy