【问题标题】:SQL Server : cursor Inserting a line if one doesn't existSQL Server:光标如果不存在则插入一行
【发布时间】:2016-11-07 11:37:34
【问题描述】:

我有以下查询 - 一个游标循环遍历表 ltr_program 拉动一列 (id) 将该值插入到新创建的表中。它还将一个 id 字段添加到新创建的表中。

我很难添加逻辑来说明仅在目标表中不存在该 id 时才添加该 id(该作业将定期运行,并且随着时间的推移将添加新的 id)。我希望代码更加动态,只添加新创建的数据。

DECLARE @next int, @program int

DECLARE insert_cursor CURSOR FOR  
    SELECT id
    FROM ltr_program

OPEN insert_cursor   

FETCH NEXT FROM insert_cursor INTO @program   

WHILE @@FETCH_STATUS = 0 
BEGIN   
    SET @next = (SELECT MAX(id) FROM LTR_Budget) + 1                     

    INSERT INTO LTR_Budget (id, ProgramID) 
        SELECT @next, @program 

    FETCH NEXT FROM insert_cursor INTO @program   
END   

CLOSE insert_cursor
DEALLOCATE insert_cursor

谢谢,

【问题讨论】:

  • MySQL 还是 SQL Server?恐怕不能两者兼得。
  • 对不起,SQL Server(当你点击快速添加时会发生这种情况)
  • 不要为此使用光标。这应该是一个插入语句。当然,当使用“滚动自己的”递增值而不是使用标识时,您会遇到潜在的并发问题。
  • 我将 id 字段更新为身份。

标签: sql-server insert cursor exists not-exists


【解决方案1】:

这应该可以解决问题。

INSERT INTO LTR_Budget (id, ProgramID)
SELECT @next, @program
where @program NOT IN (select distinct ProgramID from LTR_Budget)

FETCH NEXT FROM insert_cursor INTO @program

但是,您确实应该考虑在没有光标的情况下重写它。 您可以将 id(在 LTR_Budet 中)设为一个 IDENTITY 列,该列会随着每次插入自动递增,并将其重写为:

INSERT INTO LTR_Budget (id, ProgramID)
SELECT id as ProgramID 
FROM ltr_program where id NOT IN (SELECT DISTINCT ProgramID from LTR_Budget)

这样会干净得多。

【讨论】:

  • 我将 id 字段更新为身份。谢谢你这工作!
  • 当然。在回答中没有提到这一点,但您可能希望在标识列上放置一个索引。很多时候人们把 PRIMARY KEY 放在那里(因为它保证是唯一的而不是 NULL)
【解决方案2】:
DECLARE @next INT;
SET @next = (SELECT MAX(id) FROM LTR_Budget);

INSERT INTO LTR_Budget (id, ProgramID)
SELECT
    ROW_NUMBER() OVER (ORDER BY p.id) + @next,
    p.id
FROM
    ltr_program p
LEFT JOIN
    LTR_Budget b
        ON p.id = b.id
WHERE
    b.id IS NULL;

【讨论】:

    猜你喜欢
    • 2011-09-01
    • 2020-08-07
    • 2018-09-17
    • 1970-01-01
    • 2015-07-06
    • 2011-07-01
    • 1970-01-01
    • 2011-04-11
    • 2023-03-21
    相关资源
    最近更新 更多