【问题标题】:What is wrong with the syntax of this OUTPUT statement (SQL Server 2005)?此 OUTPUT 语句 (SQL Server 2005) 的语法有什么问题?
【发布时间】:2011-04-30 08:32:22
【问题描述】:

我试图在存储过程中使用 OUTPUT 语句来返回新插入行的 ID。存储过程是:

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”附近的语法不正确。


我尝试了该代码的几种排列都无济于事(相同的错误消息),包括将 OUTPUT 语句与 INSERT 语句移动到同一行。你知道我的语法有什么问题吗?提前感谢您的帮助,

-埃里克

【问题讨论】:

  • 我认为,如果您只返回一个值,那么使用输出参数(请参阅我的答案)会更容易从 T-SQL 或 C# 等语言中使用。

标签: sql sql-server-2005 tsql stored-procedures


【解决方案1】:

应该是这样的:

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

【讨论】:

    【解决方案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)
    

    您还可以在 OUPUT 语句之后添加“INTO @MyVariable”或“INTO MyTable”

    【讨论】:

    • 如果您想稍后使用输出变量,最好将其输出到表变量(如果您希望插入/更新/删除多行)或变量(如果您正在使用只保证一条记录的语法。
    【解决方案3】:

    它的顺序。 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) 
    

    【讨论】:

      【解决方案4】:

      来自 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());
      

      【讨论】:

        猜你喜欢
        • 2011-08-28
        • 1970-01-01
        • 2020-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-06
        相关资源
        最近更新 更多