2010-10-25 5 views
8

J'essaie d'utiliser l'instruction OUTPUT dans une procédure stockée afin de renvoyer l'ID d'une ligne nouvellement insérée. La procédure stockée est:Quel est le problème avec la syntaxe de cette instruction 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 

Lorsque je tente de compiler cette procédure stockée, je reçois un message d'erreur:

syntaxe incorrecte près de « SORTIE ».


J'ai essayé plusieurs permutations de ce code sans succès (même message d'erreur), y compris le déplacement de la déclaration de sortie sur la même ligne que l'instruction INSERT. Savez-vous quel est le problème avec ma syntaxe? Merci d'avance pour votre aide,

-Eric

+0

Je pense que si vous ne renvoyez qu'une seule valeur, alors utiliser un paramètre ouput (voir ma réponse) est un peu plus facile à utiliser à la fois depuis T-SQL ou un langage comme C#. –

Répondre

13

Son ordre. The OUTPUT clause devrait aller entre le INSERT et les lignes VALUES.

Il suffit de déplacer le vôtre, comme ceci:

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

Merci, cela fonctionne! –

1

De 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

Je pense que ce devrait être comme:

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) 

Vous pouvez également ajouter un "EN @MyVariable" ou "EN MyTable" après la OUPUT déclaration

+0

Si vous souhaitez utiliser ultérieurement la variable de sortie, il est préférable de l'afficher dans une variable de table (si vous souhaitez que plusieurs lignes soient insérées/mises à jour/supprimées) ou varaible si vous utilisez une syntaxe qui garantira un seul enregistrement . – HLGEM

+0

oui, je voulais dire une variable de table ... – Antonio

0

devrait être quelque chose comme:

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