2010-10-25 89 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()