2010-10-25 2 views
8

Sto cercando di utilizzare l'istruzione OUTPUT in una stored procedure per restituire l'ID di una riga appena inserita. La stored procedure è:Cosa c'è di sbagliato nella sintassi di questa istruzione 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 

Quando provo a compilare questa stored procedure, ricevo un messaggio di errore:

la sintassi non corretta in prossimità 'USCITA'.


Ho provato diverse permutazioni di questo codice senza alcun risultato (stesso messaggio di errore), tra cui si muove la dichiarazione OUTPUT sulla stessa linea, come l'istruzione INSERT. Sai qual è il problema con la mia sintassi? Grazie in anticipo per il vostro aiuto,

-Eric

+0

Penso che se si restituisce solo un singolo valore, quindi utilizzando un parametro ouput (vedi la mia risposta) è un po 'più facile consumare sia da T-SQL che da un linguaggio come C#. –

risposta

13

sua l'ordine. The OUTPUT clause dovrebbe passare tra le righe INSERT e VALUES.

Basta spostare la vostra, in questo modo:

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

Grazie, funziona! –

1

Da 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

penso che dovrebbe essere come:

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) 

È inoltre possibile aggiungere un "INTO @MyVariable" o "in MyTable" dopo l'output dichiarazione

+0

Se si desidera utilizzare la variabile di output in un secondo momento, è preferibile eseguire l'output su una variabile di tabella (se ci si aspetterebbe l'inserimento/l'aggiornamento/l'eliminazione di più righe) o un varaible se si utilizza una sintassi che garantirà un solo record . – HLGEM

+0

sì, intendevo una variabile di tabella ... – Antonio

0

dovrebbe essere qualcosa di simile:

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