SQL 服务器:游标如果不存在则插入一行

SQL Server : cursor Inserting a line if one doesn't exist

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

我很难添加逻辑来说明只添加目标中不存在的 ID table(作业将 运行 定期添加新 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

谢谢,

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;

这应该可以解决问题。

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)

那样会干净很多。