使用mssql在单个有效查询中插入2个连接表

时间:2014-11-08 09:33:07

标签: sql-server join sql-insert

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

考虑以下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”(自动增量)并在同一查询中使用它?

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

我不认为你所做的事情是可能的。

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

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 :(得分:0)

尝试此查询

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)