光标和打印功能和光标出现问题

时间:2010-09-06 08:25:11

标签: sql sql-server sql-server-2008

我只是在SQL 2008中使用游标,但我遇到了一些问题。 第一个是我在每次执行查询时都声明了光标,它给了我一个错误。表示已存在具有此名称的光标。我想给我一个方法,如果光标存在不创建它,如果它没有定义,sql创建它。我已经关闭并在代码末尾取消分配光标,但问题仍然存在。

declare c1 cursor fast_forward for select CustomerID, [Customer Name], [Product Name],  
Maximum from favorit;
open c1
fetch next from c1 into @custID, @custName, @prodName, @max;
while @@FETCH_STATUS = 0
begin
PRINT @CustID, @custName;
fetch next from c1 into @custID, @custName, @prodName, @max;
end
close c1
deallocate c1

我还有一个关于sql中打印功能的问题,下面有一行

PRINT @CustID, @custName;

无效? SQL中的语法是什么,我们如何在SQL中打印几个变量,如果有可能请建议一种方法来控制两个变量和它们之间的一些字符串,例如如下所示:

 print @custID + 'this is the customer name' + @custName + 'etc'

我印刷的每一行只有另外一个问题我想要打印行数,比如这样的事情:
1客户名称客户ID ...
2客户名称客户ID ...
...
光标结束。
你将如何提供在光标的while语句中实现和打印这些数字 ?

2 个答案:

答案 0 :(得分:2)

你要做的事情并不是很清楚。为什么不运行查询一次性获取所有结果,然后使用客户端代码格式化和显示数据?

select CustomerID, [Customer Name], [Product Name], Maximum from favorit

如果需要,可以使用ROW_NUMBER()函数添加行号,或者在显示输出时在客户端应用程序中对它们进行编号。

接下来,PRINT是一个声明,而不是一个函数。它只能打印一个字符串,因此您需要构建然后打印字符串。您的第二个示例可能确实有效,但您必须处理任何不同的数据类型:

print cast(@custID as varchar(10)) + 'this is the customer name' + cast(@custName as varchar(100)) + 'etc'  

最后,直接从TSQL格式化和打印数据通常表明您做错了。通常的方法是将结果集返回给客户端应用程序,让客户端应用程序对其进行格式化,打印,将其转换为PDF或其他任何内容。您的应用程序可能是一个小型Perl脚本,一个完整的报告解决方案,或介于两者之间的任何内容,但PRINT实际上并不是一个很好的机制来呈现数据。

答案 1 :(得分:0)

您可以在顶部声明光标然后在需要时将其打开。 “open”命令导致从db中检索新数据。

那么你的打印语法是这样的:

print 'my custI is %1!, custName is %2!', @custId, @custName