TSQL中块中使用的动态光标?

TSQL中块中使用的动态光标?,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,我有以下TSQL代码: -- 1. define a cursor DECLARE c_Temp CURSOR FOR SELECT name FROM employees; DECLARE @name varchar(100); -- 2. open it OPEN c_Temp; -- 3. first fetch FETCH NEXT FROM c_Temp INTO @name; WHILE @@FETCH_STATUS = 0 BEGIN print @name; F

我有以下TSQL代码:

-- 1. define a cursor
DECLARE c_Temp CURSOR FOR
    SELECT name FROM employees;

DECLARE @name varchar(100);
-- 2. open it
OPEN c_Temp;
-- 3. first fetch
FETCH NEXT FROM c_Temp INTO @name;
WHILE @@FETCH_STATUS = 0
BEGIN
  print @name;
  FETCH NEXT FROM c_Temp INTO @name; -- fetch again in a loop
END
-- 4. close it
....
我仅在循环块中使用名称值。我得走了

定义一个游标变量, 打开它, 取两次 关上它。 在PL/SQL中,循环可以如下所示:

FOR rRec IN (SELECT name FROM employees) LOOP
  DBMS_OUTPUT.put_line(rRec.name);
END LOOP;

它比我的TSQL代码简单得多。不需要定义游标。它是动态创建的,可以在循环块中访问,就像C for循环一样。不确定TSQL中是否有类似的东西?

这些东西可能适合您,尽管这取决于是否有ID列或其他唯一标识符

Declare @au_id Varchar(20)
Select @au_id = Min(au_id) from authors

While @au_id IS NOT NULL
Begin
            Select au_id, au_lname, au_fname from authors Where au_id = @au_id
            Select @au_id = min(au_id) from authors where au_id > @au_id
End

尽管这取决于是否有ID列或其他唯一标识符,但这些内容可能对您有用

Declare @au_id Varchar(20)
Select @au_id = Min(au_id) from authors

While @au_id IS NOT NULL
Begin
            Select au_id, au_lname, au_fname from authors Where au_id = @au_id
            Select @au_id = min(au_id) from authors where au_id > @au_id
End

由于您来自经常使用游标的Oracle背景,您可能不知道在SQl Server中游标是性能杀手。取决于您实际执行的操作,当然不仅仅是打印变量,可能还有更快的基于集合的解决方案。

由于您来自Oracle背景,经常使用游标,您可能没有意识到在SQl Server中游标是性能杀手。取决于您实际执行的操作,当然不仅仅是打印变量,可能还有更快的基于集合的解决方案。

游标在Sql Server中是邪恶的,因为它们确实会降低性能-我最喜欢的方法是使用表变量>=Sql Server 2005和自动inc ID列:

Declare @LoopTable as table (
     ID int identity(1,1),
     column1 varchar(10),
     column2 datetime
)
insert into @LoopTable (column1, column2)
select name, startdate from employees

declare @count int
declare @max int
select @max = max(ID) from @LoopTable 
select @count = 1

while @count <= @max
begin
   --do something here using row number '@count' from @looptable
   set @count = @count + 1
end

它看起来很冗长,但在任何情况下都能工作,应该比游标轻得多。游标在Sql Server中是邪恶的,因为它们会降低性能。我最喜欢的方法是使用表变量>=Sql Server 2005和auto inc ID列:

Declare @LoopTable as table (
     ID int identity(1,1),
     column1 varchar(10),
     column2 datetime
)
insert into @LoopTable (column1, column2)
select name, startdate from employees

declare @count int
declare @max int
select @max = max(ID) from @LoopTable 
select @count = 1

while @count <= @max
begin
   --do something here using row number '@count' from @looptable
   set @count = @count + 1
end

它看起来很冗长,但在任何情况下都可以工作,而且应该比光标轻得多。在某些情况下,也可以使用如下技巧:

DECLARE @name VARCHAR(MAX)

SELECT  @name = ISNULL(@name + CHAR(13) + CHAR(10), '') + name
FROM    employees

PRINT   @name
查看员工姓名列表


它也可以用来生成逗号分隔的字符串,只需将+CHAR13+CHAR10替换为+','

在某些情况下,也可以使用如下技巧:

DECLARE @name VARCHAR(MAX)

SELECT  @name = ISNULL(@name + CHAR(13) + CHAR(10), '') + name
FROM    employees

PRINT   @name
查看员工姓名列表


它还可以用来生成逗号分隔的字符串,只需将+CHAR13+CHAR10替换为+',“

为什么不直接使用select语句返回记录集呢。我假设对象是复制和粘贴UI中的值,这是基于您只是打印输出的事实?在ManagementStudio中,您可以从网格中复制和粘贴,或者按+T,然后运行查询并以纯文本形式将结果作为messages选项卡的一部分返回


如果要通过应用程序运行此操作,应用程序将无法访问打印的语句,因为它们没有在记录集中返回。

为什么不直接使用select语句返回记录集呢。我假设对象是复制和粘贴UI中的值,这是基于您只是打印输出的事实?在ManagementStudio中,您可以从网格中复制和粘贴,或者按+T,然后运行查询并以纯文本形式将结果作为messages选项卡的一部分返回


如果通过应用程序运行此操作,应用程序将无法访问打印的语句,因为它们不会在记录集中返回。

我使用的是Microsoft SQL server 2005我使用的是Microsoft SQL server 2005实际上,在一种情况下,只有一个varchar列,您的方法不适用于该列。也适用于字符:当'C'>'B'时选择大小写,然后选择1其他0 End实际上,在一种情况下,只有一个varchar列,并且您的方法不适用于该列。也适用于字符:当'C'>'B'时选择大小写,然后选择1其他0 ENDI,如此。但是,我不明白为什么表中有第2列datetime。如果没有列,它可以正常工作。我看到您从employee表中选择StartDate。抱歉,这两列只是示例,说明您可以扩展它,在表variable中使用manh列,我喜欢这一列。但是,我不明白为什么表中有第2列datetime。如果没有列,它可以正常工作。我看到您从employee表中选择StartDate。抱歉。抱歉-这两列只是示例,说明您可以在表变量中将其扩展为您喜欢的manh列