2009-02-25 44 views
6

OK,我知道这是可以做到的,我这样做很多时候,但为什么这么难做到在T-SQL的循环?我可以想到很多我想通过查询结果集解析的原因,并且做一些无法在没有循环的情况下完成的任务,但是设置和执行我的循环的代码大于20行。为什么会这样很难做一个循环,T-SQL

我相信其他人也有类似的看法,为什么是我们仍然没有进行一个循环的简单方法?

旁白:我们终于在SQL2008有一个UPSERT(又名合并),所以也许所有的希望都不会丢失。

回答

22

SQL是一组为基础的,declarative language;不是程序性的或imperative language。 T-SQL试图跨越这两者,但它仍建立在基于集合的基础范式之上。

+0

你有这些正确的方法吗? – AnthonyWJones 2009-02-25 21:51:59

+0

哎呀!你是对的,我粘贴我的链接在错误的顺序:)谢谢 – 2009-02-25 21:52:46

1

因为SQL是基于集合的语言。 sql的强大功能是根据特定的特性在更大的数据组中找到一个较小的组。为了处理这个任务,循环是很不必要的。显然,它是为了方便处理某些情况而添加的,但是该语言的预期用途使此功能无关紧要。

2

T-SQL的设计不是命令式语言。其设计是声明性的。它的声明性特性允许optomizer分割各种任务并平行运行它们,并以其他方式按照最有效的顺序执行操作。

-2

我不是数据库的专家,但我相信数据库事务的原子性将使得难以实现循环,因为该交易是完全的或不应该出现在所有。保持状态可以讨厌!

Wikipedia Article on Atomicity

0

SQL是一种基于SET系统,而不是程序(循环)之一。通常,它被认为是在SQL中使用循环的不好的做法,因为它们与基于集合的等价物相比性能不佳。

WHILE是最常见的循环结构,光标也可以使用,但有自己的问题(忘记解除分配/关闭)

... WHILE的例子(你可能不需要它,但其他人可能)

DECLARE @iterator INT 
SET @iterator = 0 

WHILE @iterator < 20 
BEGIN 
    SELECT * FROM table WHERE rowKey = @iterator 
/*do stuff*/ 
    @iterator = @iterator + 1 
END 

真正的问题是“它是什么,你正在尝试做的,根本无法在一套基于这样做呢?”

10

我能想到一吨的原因,我会想解析直通设置查询结果,并做一些事情,根本就没有一个循环

而且绝大多数来完成的那些我可以告诉你如何在基于集合的操作中完成它,或者解释为什么它应该在客户端代码而不是数据库中完成。需要在sql中进行循环的情况非常罕见。

+1

我同意他们应该在客户端代码完成;然而,当我们处理数百万条记录时,即使数据库中没有合适的“位置”,也可以在数据库中完成100倍(1000倍?)的处理。 – 2009-02-26 15:29:32

1

几乎一切都可以根据设定来完成,请尝试使用数字表

为何20行?这就是你需要的全部

select *,identity(int, 1,1) as Someid into #temp 
from sysobjects 

declare @id int, @MaxId int 
select @id = 1,@MaxId = max(Someid) from #temp 

while @id < @MaxId 
begin 
-- do your stuff here 
print @id 
set @id [email protected] + 1 
end 
1

它取决于你想在循环中做什么。使用while循环并不难:

declare @i int 
set @i = 20 
while @i>0 begin 
... do some stuff 
set @i = @i-1 
end 

它只是在使用游标时变得很麻烦,这应该避免反正。

1

您可以尝试使用用户定义的函数来完成大部分工作,而不是采用基于循环的方法。这将保留基于设置的SQL语言的意图。