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)
那样会干净很多。
我有以下查询 - 一个循环遍历 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)
那样会干净很多。