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

hsn1982 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 --这句提示话法错误
不明白为什么会这样,应该怎么解决,谢谢
...全文
425 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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)

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧