• 主页
  • 基础类
  • 应用实例
  • 新技术前沿

请问存储过程中使用游标,cursor for @vSql怎么不能通过

hsn1982 珠海市晟意网络科技有限公司 CTO/CIO/技术副总裁/总工程师  2006-07-10 04:20:20

DECLARE @vSql varchar(200)
set @vSql = 'SELECT GroupId,Name,FullName,IsPrivate,Description,CreateDT,UpdateDT FROM '
If @GroupId is not NULL
set @vSql =@vSql + ' Where GroupId =' + @GroupId

DECLARE cursor1 CURSOR FOR @vSql --这句提示话法错误
不明白为什么会这样,应该怎么解决,谢谢
...全文
351 点赞 收藏 13
写回复
13 条回复
playwarcraft 2006年07月11日
想了個笨方法,@_@

DECLARE @vSql varchar(200)
set @vSql = 'SELECT GroupId,Name,FullName,IsPrivate,Description,CreateDT,UpdateDT FROM T '
If @GroupId is not NULL
set @vSql =@vSql + ' Where GroupId =' + @GroupId

set @vSql='select * into temp_T from ('+@vSql+') A' ---Add temp_T

DECLARE cursor1 CURSOR FOR select * from temp_T
...
...
drop table temp_T
回复 点赞
smile9961 2006年07月11日
if exists (selectt top 1 1 from #temp)前面漏了一句:exec sp_executesql @vSql
回复 点赞
smile9961 2006年07月11日
create table #temp
(
GroupId int,
Name varchar(50),
FullName varchar(100),
sPrivate bit,
description varchar(1000),
CreateDt datetime,
updateDt datetime
)

DECLARE @vSql Nvarchar(200)
set @vSql = 'insert Into #temp(GroupId,Name,FullName,IsPrivate,Description,CreateDT,UpdateDT) '
set @vSql = @vSql + 'SELECT GroupId,Name,FullName,IsPrivate,Description,CreateDT,UpdateDT FROM '
If @GroupId is not NULL
begin
set @vSql =@vSql + ' Where GroupId =' + @GroupId
end

if exists (selectt top 1 1 from #temp)
begin
DECLARE cursor1 CURSOR FOR ( select GroupId from #temp)
...
end
回复 点赞
hellowork 2006年07月11日
使用EXEC(@sql)生成的游标可能仅限于EXEC这个进程内,因为退出EXEC这个进程时并没有close它,所以可以在EXEC之后访问它,但是关闭它或清除(deallocate)它可能会有问题,大概是因为变量的作用域(scope)问题吧,不知道SQLSERVER对变量作用域是怎么控制的,不敢妄言,只是猜测.
回复 点赞
hsn1982 2006年07月11日
to hellowork:
你的方法我也想过,如果的确没有更好的解决方法,只能这样做了

to wgsasd311(自强不息):
可能你没理解我请求帮助的原因
回复 点赞
hsn1982 2006年07月11日
看来没有什么好的解决方法,准备结贴了
回复 点赞
wgsasd311 2006年07月10日
--try
If @GroupId is NULL RETURN --如果是NULL,则返回不执行下面代码
DECLARE cursor1 CURSOR FOR
SELECT GroupId,Name,FullName,IsPrivate,Description,CreateDT,UpdateDT FROM
Where GroupId =@GroupId
回复 点赞
hellowork 2006年07月10日
试试这样写:
If @GroupId is not NULL
DECLARE cursor1 CURSOR FOR
SELECT GroupId,Name,FullName,IsPrivate,Description,CreateDT,UpdateDT
FROM tab
Where GroupId = @GroupId
else
DECLARE cursor1 CURSOR FOR
SELECT GroupId,Name,FullName,IsPrivate,Description,CreateDT,UpdateDT
FROM tab
open cursor1
......
回复 点赞
vfp_system 2006年07月10日
所有存入变量的SQL语句只能通过EXEC(UTE)来执行。仔细查下这个东东的用法
回复 点赞
hsn1982 2006年07月10日
TO vfp_system(菜鸟一个) :
的确是少了表名,呵呵,不过这是copy时漏掉了
回复 点赞
vfp_system 2006年07月10日
语句好像有错误吧,DECLARE @vSql varchar(200)
set @vSql = 'SELECT GroupId,Name,FullName,IsPrivate,Description,CreateDT,UpdateDT FROM  ?????? '
If @GroupId is not NULL
set @vSql =@vSql + ' Where GroupId =' + @GroupId

set @vSql='DECLARE cursor1 CURSOR FOR '+@vSql
exec(@vSql)
打?的地方没有表名
回复 点赞
hsn1982 2006年07月10日
to libin_ftsafe(子陌红尘:当libin告别ftsafe) :
谢谢你的帮助。
你的方法确实可以通过编译,不过exec @sql之后的代码中,cursor1就不可以使用,提示为找不到cursor1
回复 点赞
子陌红尘 2006年07月10日
DECLARE @vSql varchar(200)
set @vSql = 'SELECT GroupId,Name,FullName,IsPrivate,Description,CreateDT,UpdateDT FROM '
If @GroupId is not NULL
set @vSql =@vSql + ' Where GroupId =' + @GroupId

set @vSql='DECLARE cursor1 CURSOR FOR '+@vSql
exec(@vSql)
回复 点赞
发动态
发帖子
MS-SQL Server
创建于2007-09-28

1.4w+

社区成员

25.3w+

社区内容

MS-SQL Server相关内容讨论专区
社区公告
暂无公告