我的表包含这些值
Name VARCHAR(50),
Program VARCHAR(50),
Branch VARCHAR(30),
TotalP INT,
TotalN INT)
如果名称尚不存在,我一直在尝试将记录插入此表。这可能已经在这里得到了回答,但是当我在搜索中输入一些内容时,它会出现 7000 多个结果,我查看了 100 多个结果,但仍然没有找到答案。任何和所有的帮助表示赞赏。
我的表包含这些值
Name VARCHAR(50),
Program VARCHAR(50),
Branch VARCHAR(30),
TotalP INT,
TotalN INT)
如果名称尚不存在,我一直在尝试将记录插入此表。这可能已经在这里得到了回答,但是当我在搜索中输入一些内容时,它会出现 7000 多个结果,我查看了 100 多个结果,但仍然没有找到答案。任何和所有的帮助表示赞赏。
如果您不担心并发性,则可以使用以下方法:
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 EXISTS
INSERT
为防止这种情况,您可以向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 JOIN
和IS 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