2010-10-25 4 views
8

Próbuję użyć instrukcji OUTPUT w procedurze przechowywanej, aby zwrócić identyfikator nowo wstawionego wiersza. Procedura składowana jest:Co jest nie tak ze składnią instrukcji OUTPUT (SQL Server 2005)?

CREATE PROCEDURE PROC_RESTORE_REQUEST_TO_QUEUE 
    @cs_uri_stem varchar(900), 
    @cs_uri_query varchar(2500), 
    @date datetime, 
    @time datetime, 
    @queue_state smallint, 
    @process_id int, 
    @simulation_start_time bigint, 
    @num_failures smallint 

AS 

SET NOCOUNT ON 

INSERT INTO [DD#WORK].[dbo].[ebhFifoQueue] ([cs-uri-stem],[cs-uri-query],[date],[time],[queue_state],[process_id],[simulation_start_time],[num_failures]) 
VALUES (@cs_uri_stem,@cs_uri_query,@date,@time,@queue_state,@process_id,@simulation_start_time,@num_failures) 

OUTPUT INSERTED.id 

Kiedy próbuję skompilować tej procedury przechowywanej, otrzymuję komunikat o błędzie:

Niepoprawna składnia w pobliżu „wyjście”.


Próbowałem kilka permutacji tego kodu bezskutecznie (sam komunikat o błędzie), w tym przeniesienie oświadczenie OUTPUT na tej samej linii co INSERT. Czy wiesz, jaki jest problem z moją składnią? Dzięki z góry za pomoc,

-Eric

+0

Myślę, że jeśli zwracasz tylko jedną wartość, to za pomocą parametru ouput (zobacz moją odpowiedź) jest nieco łatwiej zużywać zarówno z T-SQL lub języka, takiego jak C#. –

Odpowiedz

13

Jego rozkaz. The OUTPUT clause powinien przechodzić między wierszami INSERT i VALUES.

Wystarczy przesunąć je w następujący sposób:

INSERT INTO [DD#WORK].[dbo].[ebhFifoQueue] ([cs-uri-stem],[cs-uri-query],[date],[time],[queue_state],[process_id],[simulation_start_time],[num_failures]) 
OUTPUT INSERTED.id 
VALUES (@cs_uri_stem,@cs_uri_query,@date,@time,@queue_state,@process_id,@simulation_start_time,@num_failures) 
+0

Dzięki, to działa! –

1

Od MSDN

DECLARE @MyTableVar table(NewScrapReasonID smallint, 
          Name varchar(50), 
          ModifiedDate datetime); 

INSERT Production.ScrapReason 
    OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate 
     INTO @MyTableVar 
VALUES (N'Operator error', GETDATE()); 
2

myślę, że powinno być tak:

INSERT INTO [DD#WORK].[dbo].[ebhFifoQueue] ([cs-uri-stem],[cs-uri-query],[date],[time],[queue_state],[process_id],[simulation_start_time],[num_failures]) 

OUTPUT INSERTED.id 

VALUES 
(@cs_uri_stem,@cs_uri_query,@date,@time,@queue_state,@process_id,@simulation_start_time,@num_failures) 

Można również dodać "INTO @MyVariable" lub "POD MyTable" po Ouput oświadczenie

+0

Jeśli chcesz później użyć zmiennej wyjściowej, najlepiej jest wypisać ją do zmiennej tabeli (jeśli chcesz, aby wiele wierszy zostało wstawionych/zaktualizowanych/usuniętych) lub zmienna, jeśli używasz składni, która zagwarantuje tylko jeden rekord . – HLGEM

+0

tak, miałem na myśli zmienną tabeli ... – Antonio

0

powinno być coś takiego:

CREATE PROCEDURE PROC_RESTORE_REQUEST_TO_QUEUE 
    @cs_uri_stem varchar(900), 
    @cs_uri_query varchar(2500), 
    @date datetime, 
    @time datetime, 
    @queue_state smallint, 
    @process_id int, 
    @simulation_start_time bigint, 
    @num_failures smallint, 
    @new_id int OUTPUT 

AS 

SET NOCOUNT ON 

INSERT INTO [DD#WORK].[dbo].[ebhFifoQueue] ([cs-uri-stem],[cs-uri-query],[date],[time],[queue_state],[process_id],[simulation_start_time],[num_failures]) 
VALUES (@cs_uri_stem,@cs_uri_query,@date,@time,@queue_state,@process_id,@simulation_start_time,@num_failures) 

SET @new_id = SCOPE_IDENTITY()