动态SQL的问题,求助!
存贮过程中使用的表名和查询条件都要从外部作为参数传入
create proc csearch
@tablename sysname,
@condition varchar(2000)
as
declare @sqlstr varchar(4000)
set @sqlstr = 'declare cur_result cursor for select a,b,c from ' + @tablename + ' where ' + @condition
exec executesql @sqlstr
open cur_result
......
运行时报错:
没有名为cur_result的cursor
有什么办法解决吗?
[解决办法]
create proc csearch
@tablename sysname,
@condition varchar(2000)=NULL
as
DECLARE @WHERE VARCHAR(MAX)
SET @WHERE=''
SELECT @condition=ISNULL(@condition,'')
IF @condition>''
SET @WHERE=' WHERE @condition'
BEGIN
declare @sqlstr nvarchar(4000)
set @sqlstr = 'declare cur_result cursor for select a,b,c from ' + @tablename + '+@WHERE+'
SET @sqlstr=@sqlstr+' open cur_result .....'
EXEC sp_executesql @sqlstr,N'@condition varchar(2000),@condition
end
[解决办法]
executesql执行动态语句,这个语句中如果生成coursor,在这个语句之外可能无法引用。
这跟SQL Server动态语句的作用域有关。
[解决办法]
+1
你游标的操作语句要放在execute sp_excutesql的第一个参数里面执行。或者用临时表。
[解决办法]
alter proc csearch1
@tablename sysname,
@condition varchar(100)=null
as
begin
declare @sqlstr varchar(4000)
set @sqlstr = 'declare cur_result cursor for select timestr from ' + @tablename + ' where ' + @condition
exec(@sqlstr)
open cur_result
close cur_result
deallocate cur_result
end
执行通过。