2010-10-25 16 views
8

Estoy tratando de usar la instrucción OUTPUT en un procedimiento almacenado para devolver el ID de una fila recién insertada. El procedimiento almacenado es:¿Qué hay de malo con la sintaxis de esta instrucción 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 

Cuando intento compilar este procedimiento almacenado, aparece un mensaje de error:

sintaxis incorrecta cerca de 'salida'.


He intentado varias permutaciones de este código en vano (el mismo mensaje de error), incluyendo el traslado de la instrucción de salida en la misma línea que la instrucción INSERT. ¿Sabes cuál es el problema con mi sintaxis? Gracias de antemano por su ayuda,

-Eric

+0

Creo que si solo devuelve un valor único, usar un parámetro de salida (ver mi respuesta) es un poco más fácil de consumir tanto desde T-SQL como desde un lenguaje como C#. –

Respuesta

13

Su orden. The OUTPUT clause debe ir entre las líneas INSERT y VALUES.

Basta con mover la suya, así:

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

¡Gracias, esto funciona! –

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

creo que debería ser como:

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) 

También puede agregar a "en @MyVariable" o "en MiTabla" después de la SALIDA declaración

+0

Si desea utilizar la variable de salida más adelante, lo mejor es enviarlo a una variable de tabla (si es de esperar que se inserten/actualicen/eliminen varias filas) o un varaible si está utilizando una sintaxis que garantizará solo un registro . – HLGEM

+0

sí, quise decir una variable de tabla ... – Antonio

0

debe ser algo como:

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