1

我想出了这个查询,赞美时不会产生任何错误,但我不知道我是否可以使用这个 select语句作为value

insert into store(c1 ,artno, c3, c4, c5, c6, c7 )
           select '1', a.artno, 0,0.0,null,null,null 
           from art a
              left join store s on s.artno=a.artno
              inner join status b on a.artno = b.artno
    where b.state ='5'  
      and s.artno is null  
      and a.artgroup not in('63','280') 

我还看到了另一种可以使用的替代方法,但不确定它是否可以insert按照我的要求使用,我看到这是在存储过程中实现的,所以只是抓住了它是否可以使用的想法?

declare @artno as varchar(150); 
declare @count as tinyint

Declare cS CURSOR For
               select  a.artno
               from art a
              left join store s on s.artno=a.artno
              inner join status b on a.artno = b.artno
    where b.staus ='5'  
      and s.artno is null  
      and a.artgroup not in('63','280') 


Open cS
Fetch NEXT from cS into @artno

While @@FETCH_STATUS=0

select @count=COUNT(*) from store where artno=@artno
if @count=0 

 BEGIN

insert into store(c1 ,artno, c3, c4, c5, c6, c7 )
           values('1', a.artno, 0,0.0,null,null,null)                 

    fetch next from cS into @artno                 
 END 
 close cS
 deallocate cS

一些解释哪些使用,哪些不使用以及为什么,也会对我的知识有所帮助。

4

2 回答 2

1

光标是内存密集型和耗时的。而SELECT INTO会预先构建要插入的表格内容,并且可以一次性完成。同样在 情况下SELECT INTO,SQL 引擎有机会优化数据获取,而在情况下cursor,您将强制数据库按顺序获取行并且无法进行优化。

http://blog.sqlauthority.com/2011/08/10/sql-server-use-insert-into-select-instead-of-cursor/

浏览上述支持我的声明的链接。

于 2012-08-09T12:00:36.663 回答
1

由于在其他任何地方都没有提到它,因此游标还有另一个问题。对数据库的每次插入/更新都需要从客户端到服务器的往返通信。

从性能的角度来看,这实际上比听起来更糟糕。数据库通常旨在有效地将数据批量插入表中。插入 100 行的努力很少是插入 1 行的努力的 100 倍。更典型的是,它只会更长一点。

当您使用游标时,您正在强制“序列化”操作。因此,必须先完成第一行的整个操作,然后才能移至第二行。这会从根本上降低性能。

正如其他人所提到的,尽可能使用基于集合的操作。如果你不能,考虑改变问题,这样你就可以;-)

于 2012-08-09T14:18:20.867 回答