Sql server 检查是否存在整个记录后,用光标插入该记录

Sql server 检查是否存在整个记录后,用光标插入该记录,sql-server,tsql,database-cursor,Sql Server,Tsql,Database Cursor,我有下面的脚本,它使用游标将记录插入到一个表中(如果该表中不存在记录)。这是可行的,但我想修改它以插入整个记录,而不必单独指定每个字段。是否可以引用整个记录并插入它 SET @Cursor = CURSOR FOR SELECT [COMPANY],[LOCATION],[id] FROM [GG].[dbo].[LOCATION] OPEN @Cursor; FETCH NEXT FROM @Cursor INTO @COMPANY, @Location, @id; WHILE @@FE

我有下面的脚本,它使用游标将记录插入到一个表中(如果该表中不存在记录)。这是可行的,但我想修改它以插入整个记录,而不必单独指定每个字段。是否可以引用整个记录并插入它

SET @Cursor = CURSOR FOR
SELECT [COMPANY],[LOCATION],[id] FROM [GG].[dbo].[LOCATION]

 OPEN @Cursor;
FETCH NEXT FROM @Cursor INTO @COMPANY, @Location, @id;

WHILE @@FETCH_STATUS = 0
BEGIN
    select @numFound = count(*) FROM [GG].[dbo].[gsLocation] where company = @COMPANY and location = @Location;
    IF @numFound = 0
    BEGIN
        -- Want to be able to insert entire record instead of specifying fields
        insert into [GG].[dbo].[gsLocation] (company, Location, id) values (@COMPANY, @Location, @id)
    END

    FETCH NEXT FROM @Cursor INTO @COMPANY, @Location, @id;
END

如果没有光标,您可以做得更简单:

Insert into [GG].[dbo].[gsLocation] (COMPANY, LOCATION, id)
Select  L.COMPANY, 
        L.LOCATION, 
        L.id
From [GG].[dbo].[LOCATION] L
where not exists (Select * From [GG].[dbo].[gsLocation] where company = L.COMPANY and location = L.LOCATION)

指定列的名称始终是一个很好的做法。

为什么使用光标?????为什么对任何事情都使用光标,尤其是像插入这样简单的事情。。。选择使用游标是使用数据库中数据的最慢方法。在这种特殊情况下,它将对100行执行100个insert,而不是单个insert。在insert上指定列名是一种常见的最佳做法。从理论上讲,您的表可能具有相同的列,例如,如果创建的列不同,则列的顺序也可能不同。在没有指定列的情况下,绝不能将数据插入表中。您可以使用动态SQL查询来获取列名并创建这样的insert语句。您不需要在EXISTS表达式中使用TOP-引擎在几年前就变得非常智能了。你也不需要使用文字-*也同样有效,而且通常不会让没有经验的人感到困惑。有趣的是,我在1年前养成了使用top的习惯。这是你从未想过的事情之一。用您的建议更新了答案。不存在的地方或将位置留在。。。其中gsLocation.company为空:由于exists查询忽略了select列表,因此select 666 where exists从sys.columns中选择1/0;还有一些人被鞭打得从不使用*在一个查询中,我用它作为占位符来提醒我,我考虑过要选择什么,什么都不需要。