TSQL中块中使用的动态光标?
我有以下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
-- 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列