基本的T-SQL问题

时间:2011-02-13 03:46:42

标签: sql sql-server tsql

让我们说我有三个以多对多关系实现的表。像Person(personID),PersonMovies(personID,movieID)和Movies(movieID)之类的东西。在sql server中进行多次插入的正确方法是什么?我想插入这个人,电影,然后能够获得一个人拥有的所有电影。那么交易中会有三个插入吗?如果是这样,我会假设简单的部分插入到person和movie表中,但是如何插入PersonMovies表,因为该表依赖于其他两个表中的现有ID。我假设我将插入Person和Movies,然后某种方式设置将新插入的表的ID分配给这两个表中的变量,然后使用这些变量插入桥表。我不知道,但我希望这有点意义,因为我对此感到困惑!!

2 个答案:

答案 0 :(得分:0)

我假设你有人和电影自动增加。如果是这种情况,您需要捕获插入后的关键字段。您可以使用scope_identity()函数来获取此值。在每次插入之后,将它们保存到变量中,然后当您进入PersonMovies时,使用保存的值。

答案 1 :(得分:0)

首先插入Person记录,然后使用SCOPE_IDENTITY获取插入记录时的唯一ID。然后,您可以使用此功能插入人物电影。在插入人物电影之前,您需要使用IF EXISTS查看是否存在。如果它从现有表中选择它并将其唯一ID分配给变量。如果它还不存在,请使用相同的技术添加人物并插入电影,然后将SCOPE_IDENTITY指定给电影变量。

在PL / SQL中有一个UPSERT语句,它结合更新记录或在需要时插入它们。我在下面添加了一个代码,用于在T / SQL中执行UPSERT并在必须创建记录时返回唯一ID。

IF EXISTS (SELECT id FROM dbo.sysobjects WHERE name = 'fts_upsert_team') DROP PROCEDURE fts_upsert_team
GO

CREATE PROCEDURE fts_upsert_team
    @teamID INT OUTPUT,
    @name VARCHAR(100)

AS

    UPDATE 
        fts_teams
    SET
        name = @name
    WHERE
        teamID = @teamID

    IF @@ROWCOUNT = 0
    BEGIN

        INSERT INTO fts_teams
        (
            name
        )
        VALUES
        (
            @name
        )

        SET @teamID = SCOPE_IDENTITY()

    END


GO