1

我的表包含这些值

Name VARCHAR(50),
Program VARCHAR(50),
 Branch VARCHAR(30),
TotalP INT,
 TotalN INT)

如果名称尚不存在,我一直在尝试将记录插入此表。这可能已经在这里得到了回答,但是当我在搜索中输入一些内容时,它会出现 7000 多个结果,我查看了 100 多个结果,但仍然没有找到答案。任何和所有的帮助表示赞赏。

4

1 回答 1

2

如果您不担心并发性,则可以使用以下方法:

IF NOT EXISTS (
    SELECT 1
    FROM YourTable
    WHERE Name = @Name
)
BEGIN
    INSERT INTO YourTable (Name, Program, Branch, TotalP, TotalN)
    VALUES (@Name, @Program, @Branch, @TotalP, @TotalN)
END

这里的问题是,如果两个进程试图同时添加相同的name...IF NOT EXISTSINSERT

为防止这种情况,您可以向name列添加唯一约束,这将导致其中一个插入失败,或者您可以在NOT EXISTS检查中使用锁定表WITH (UPDLOCK, HOLDLOCK),这将降低并发性但不会引发任何错误。

编辑:

如果您想要的值来自SELECT语句,则以下内容将起作用:

INSERT INTO YourDestinationTable (Name, Program, Branch, TotalP, TotalN)
SELECT st.Name, st.Program, st.Branch, st.TotalP, st.TotalN
FROM 
    YourSourceTable st
    LEFT JOIN YourDestinationTable dt
        ON dt.Name = st.Name
WHERE 
    dt.Name IS NULL
    -- Add in any other conditions for YourSourceTable here...

YourSourceTable如果在 ... 中找不到该行,这将插入该行,YourDestinationTable使用 aLEFT JOINIS NULL检查实现。

这与以前有相同的警告...如果两个进程同时运行此语句,则可能会得到重复的name值;要么在 上添加唯一约束,要么在目标表中您正在测试是否存在于事务中的行上name执行 a :(UPDLOCK, HOLDLOCK)

BEGIN TRANSACTION
    IF NOT EXISTS (
        SELECT 1
        FROM 
            YourSourceTable st
            JOIN YourDestinationTable dt WITH (UPDLOCK, HOLDLOCK) 
                ON dt.Name = st.Name
        -- WHERE 
            -- Add in any other conditions for YourSourceTable here...
    )
    BEGIN
        INSERT INTO YourDestinationTable (Name, Program, Branch, TotalP, TotalN)
        SELECT Name, Program, Branch, TotalP, TotalN
        FROM YourSourceTable st
        -- WHERE 
        -- Add in any other conditions for YourSourceTable here...
    END
COMMIT
于 2013-01-23T19:57:08.007 回答