【问题标题】:insert into 2 joined tables in a single effecient query with mssql使用 mssql 在单个有效查询中插入 2 个连接表
【发布时间】:2014-11-08 09:33:06
【问题描述】:

我正在尝试将一些数据插入到我的 ms sql 数据库 (ms sql server 2012) 中的 2 个不同的表中。

请考虑以下 2 个表格,其中包含有关民意调查及其选择的信息。

+----------------+ 
|     Polls      |
+----------------+
| pollID         | The id of a poll (auto increment)
| memberID       | The id of the member, owning the poll
| pollTitle      | The title/question of the poll
| date           | The date of the poll
+----------------+

+----------------+ 
|  PollChoices   |
+----------------+
| pollChoiceID   | The id of a poll choice (auto increment)
| pollID         | The id of the poll, that include this choice
| pollChoice     | The name/title of the poll choice
+----------------+

如何进行查询,以最有效的方式插入数据? 我总是可以进行 2 个查询,但无法真正弄清楚如何用一个查询来完成。

在这种情况下,对我来说主要问题之一是在插入民意调查时获取民意调查的 id。我怎样才能获得这个新插入的“pollID”(自动增量)并在同一个查询中使用它?

另外,是否有必要使用事务或存储过程(我在某处读过这个)?

任何帮助将不胜感激。

【问题讨论】:

    标签: sql-server join sql-insert


    【解决方案1】:

    我不认为你在做什么是可能的。

    我认为执行您描述的操作的最佳方式是将其包装在存储过程中。您可以使用 SCOPE_IDENTITY 获取先前添加的记录的 ID 和 TRANSACTION 以及 TRY-CATCH 块,以确保 两个插入查询都被执行或根本不执行

    CREATE PROCEDURE [dbo].[usp_InsertPoll] ( 
    -- sproc declaration here, including the following parameters:  
    -- @memberID, @pollTitle, @date, @pollChoiceID, @pollChoice
    )
    AS BEGIN
    
       DECLARE @pollID INT
    
       BEGIN TRANSACTION;
    
       BEGIN TRY
    
          INSERT INTO Polls (memberID, pollTitle, date)
          VALUES (@memberID, @pollTitle, @date)
    
          -- Get the last identity value inserted into an identity column in the same scope
          SET @pollID = SCOPE_IDENTITY();
    
          INSERT INTO PollChoices(pollChoiceID, pollID, pollChoice )
          VALUES (@pollChoiceID, @pollID, @pollChoice)
    
       END TRY
       BEGIN CATCH
          IF @@TRANCOUNT > 0
             ROLLBACK TRANSACTION;            
       END CATCH;
    
       IF @@TRANCOUNT > 0
          COMMIT TRANSACTION; 
    END
    

    【讨论】:

    • 这太完美了!非常感谢。 +1!虽然我不需要“创建过程”部分,但这样做的目的是什么?
    • @user68621 它的目的是创建一个存储过程(如果你想要这样的东西)。有关 sprocs 的文档,请查看 msdn.microsoft.com/en-us/library/ms187926.aspx
    • 我知道这可能是一个“noobish”问题,但是否可以在“COMMIT TRANSACTION”部分之后将 pollID 作为结果集返回。
    • 是的,可以返回 pollID 的值:RETURN @pollID 应该可以工作。你不妨看看这里sqlteam.com/article/stored-procedures-returning-data
    • 感谢您的帮助.. 但我似乎无法让它工作。它没有返回任何东西。你能看出什么问题吗:pastebin.com/39B01iC4
    【解决方案2】:

    试试这个查询

    declare @npi int
    INSERT INTO Polls (memberID, pollTitle, date)
     VALUES (@memberID, @pollTitle, @date)
    set @npi=
    (select top 1 PollId
    from Polls
    order by PollId desc)
    INSERT INTO PollChoices(pollChoiceID, pollID, pollChoice )
       VALUES (@pollChoiceID, @npi, @pollChoice)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      • 2011-12-03
      • 1970-01-01
      • 2016-10-24
      • 1970-01-01
      相关资源
      最近更新 更多