Sql server 需要一种使用临时表在存储过程参数上循环的更快方法吗

Sql server 需要一种使用临时表在存储过程参数上循环的更快方法吗,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我有一个表,其中有一个值列表,我想在其中使用结果集作为参数来循环我的存储过程。所以基本上我想循环我的临时表的第1列。我使用while循环尝试过这个方法,但发现对于temp表中的12条记录,每行运行大约需要8秒。有没有更好或更快的方法来实现这一点: declare @id int select @id = id from #loop order by id while @@rowcount <> 0 begin set rowcount 0 truncate table

我有一个表,其中有一个值列表,我想在其中使用结果集作为参数来循环我的存储过程。所以基本上我想循环我的临时表的第1列。我使用while循环尝试过这个方法,但发现对于temp表中的12条记录,每行运行大约需要8秒。有没有更好或更快的方法来实现这一点:

declare @id int

select @id = id from #loop order by id

while @@rowcount <> 0
begin
   set rowcount 0
   truncate table #ctrl_tbl
   exec test_proc 'id1', @id

   insert into #res_tbl(res_data)
   select ctrl_data
   from   #ctrl_tbl
   except
   select ctrl_data
   from   #res_tbl

   delete #loop where id = @id
   set rowcount 1
   select @id = id from #loop order by id


end
set rowcount 0

这确实需要更加面向集合,在循环中构建/销毁表在我看来是愚蠢的。建立一个表格,填入有用的信息,如果需要的话,可以循环表中的行。这样做有很多错误-但是看看sql server的游标功能-应该可以将其减少一两个数量级-然后如果您将其更改为使用select语句而不是循环,您可以获得更快的速度。嗨,Jeremy,您所说的it需要更加面向集合的确切含义是什么?我销毁该表的原因是存储过程正在使用该表存储其结果,因此我销毁的表更像是sp的内部表。不过,如果可以,我会尽量避免循环,我只是想知道是否有更好的方法来完成我正在做的事情面向集合的方法意味着不使用while循环和游标来解决问题。相反,您创建了一个稍微复杂一些的查询,服务器可以将其作为一条语句执行,因此速度要快得多。这可能会破坏您的交易,因为您声明要运行该过程,然后就没有其他解决方案了。存储过程不能像在基于集合的操作中那样调用。为了找到一个不需要循环的解决方案,我们必须查看调用的test_proc过程的详细信息。您当前被限制一次调用一个ID的过程,这一事实可能总是需要一个循环。但是,如果将过程的逻辑与上面的逻辑结合起来,则可能存在基于集合的非循环解决方案。