2010-10-25 74 views
8

我想在存储过程中使用OUTPUT语句,以便返回新插入的行的ID。存储过程是:此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 

当我尝试编译此存储过程,我得到一个错误信息:

附近有语法错误“输出”。


我试图此代码的几个排列无济于事(相同的错误消息),包括移动OUTPUT语句到同一行INSERT语句。你知道我的语法有什么问题吗?在此先感谢您的帮助,

-Eric

+0

我认为,如果您只返回一个值,那么使用输出参数(请参阅我的答案)更容易从T-SQL或类似C#的语言中使用。 – 2010-10-25 18:14:35

回答

13

它的顺序。 The OUTPUT clause应该在INSERTVALUES之间。

只是移动你的,就像这样:

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

谢谢,这个作品! – 2010-10-25 18:22:23

1

从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

我想应该是这样的:

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) 

您还可以添加一个 “INTO @MyVariable” 或 “INTO MyTable的” 的OUPUT后声明

+0

如果您想稍后使用输出变量,最好将其输出到表变量(如果您希望插入/更新/删除多行)或者如果您使用的语法只能保证一条记录。 – HLGEM 2010-10-25 18:11:16

+0

是的,我的意思是一个表变量... – Antonio 2010-10-25 19:08:28

0

应该是这样的:

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