【问题标题】:SQL Server: How to use result from one INSERT for another INSERTSQL Server:如何将一个 INSERT 的结果用于另一个 INSERT
【发布时间】:2014-08-26 17:10:24
【问题描述】:

我有一个用于一次更新两个表的存储过程。

我的问题是第一个表有一个自动递增的 ID 列(“commentID”),而我的第二个表与此有关系,所以 我需要从第一个 INSERT 中新创建的 ID 才能使第二个插入

我尝试了以下方法,我可以保存而不会出错,但它没有按应有的方式执行,也没有按预期更新表。 有人可以告诉我我在这里做错了什么吗?

我的 SQL:

ALTER PROCEDURE [dbo].[MOC_UpdateComment]
    @imgID int,
    @commentID int = '999999',
    @comment nvarchar(1000),
    @lastUpdate nvarchar(50),
    @modBy varchar(50)
AS
BEGIN
    DECLARE @temp AS TABLE
        (
                commentID int
        )

    SET NOCOUNT ON; 

    BEGIN TRANSACTION;

        INSERT INTO MOC_BlogComments
        (
                imgID, 
                comment
        )
        OUTPUT  inserted.commentID INTO @temp(commentID)
        SELECT  @imgID,
                @comment

        INSERT INTO MOC_LogComments
        (
                commentID,
                lastUpdate,
                modTime,
                modBy   
        )
        SELECT  commentID,
                @lastUpdate,
                GETDATE(),
                @modBy
        FROM    @temp

    COMMIT TRANSACTION;  
END

【问题讨论】:

  • 您似乎正试图不恰当地插入标识值。注释掉第一个插入的 `imgID,**,剩下的就可以了。

标签: sql sql-server select insert output


【解决方案1】:
DECLARE @imgID      INT, 
        @commentID  INT = '999999', 
        @comment    NVARCHAR(1000), 
        @lastUpdate NVARCHAR(50), 
        @modBy      VARCHAR(50) 
DECLARE @MORC_BlogComments AS TABLE 
  ( 
     id      INT IDENTITY(1, 1) NOT NULL, 
     imgid   INT, 
     comment VARCHAR(100) 
  ) 
DECLARE @MORC_LogComments AS TABLE 
  ( 
     commentid  INT, 
     lastupdate DATETIME, 
     modtime    DATETIME, 
     modby      VARCHAR(100) 
  ) 
DECLARE @TEMP AS TABLE 
  ( 
     commentid INT 
  ) 

SET nocount ON; 

BEGIN TRANSACTION; 

INSERT INTO @MORC_BlogComments 
            (imgid, 
             comment) 
output      inserted.id 
INTO @TEMP(commentid) 
VALUES     (@imgID, 
            @comment) 

INSERT INTO @MORC_LogComments 
            (commentid, 
             lastupdate, 
             modtime, 
             modby) 
SELECT commentid, 
       @lastUpdate, 
       Getdate(), 
       @modBy 
FROM   @temp 

SELECT * 
FROM   @MORC_LogComments 

【讨论】:

  • 非常感谢 - 这是完美的,正是我想要的。
【解决方案2】:

函数 SCOPE_IDENTITY() 返回最后一个插入操作的标识。您可以使用它来获取您需要在第二个 INSERT 语句中使用的值

你可以在你的声明中这样使用它:

INSERT INTO MORC_BlogComments (imgID, comment)
VALUES (@imgID, @comment)

INSERT INTO MORC_LogComments (commentID, lastUpdate, modTime, modBy)
VALUES (SCOPE_IDENTITY(), @lastUpdate, GETDATE(), @modBy)

【讨论】:

  • 非常感谢!我将在上面的哪里实现这个?另外,你能告诉我上面有什么问题吗,因为我认为 OUTPUT 也是一个选项?
  • OUTPUT 实际上是一个更好的选择,因为在某些情况下 SCOPE_IDENTITY() 可能会提供不正确的结果。您的第二次(我假设)插入有什么问题?
猜你喜欢
  • 2012-11-21
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
相关资源
最近更新 更多