如何得到动态执行的sql的结果?(100分)

  • 主题发起人 主题发起人 eddywx
  • 开始时间 开始时间
E

eddywx

Unregistered / Unconfirmed
GUEST, unregistred user!
create procedure aa
@tablename varchar(20) --传入表名参数
as

declare @sqlstring varchar(200) --动态sql字符串

Set @sqlstring = 'select count(*) from '+@tablename

exec(@sqlstring)

....紧接着我想用这个count(*)的值,
我该如何取的呢?
(Set @sqlstring = 'select @某变量=count(*) from '+@tablename
行不通!)
 
Set @sqlstring = 'select count(*) into @某变量 from '+@tablename
 
你可以全部在动态sql字符里处理,例如:
CREATE procedure prtest
@tablename varchar(20) --传入表名参数
as
declare @sqlstring varchar(200) --动态sql字符串
Set @sqlstring = 'declare @cnt int select @cnt=count(*) from '+@tablename+' print @cnt'
exec(@sqlstring)

如果要传入参数,请使用sp_executesql
执行可以多次重用或动态生成的 Transact-SQL 语句或批处理。Transact-SQL 语句或批处理可以包含嵌入参数。


 
也可以:
Set @sqlstring = 'select @某变量 =count(*) from '+@tablename
 
我的意思是取出@count(*)的值
然后才在以下处理

如之前声明
declare @cnt
......
然后exec(@sqlstring)
接着写

select @cnt --本期望应该等于动态执行的sql的结果

但仍为null
(xuechao的方法在动态执行时为int型数值,但以后仍为null)

继续关注
 
to eddywx
我的意思是:所有的处理都在动态sql字符串中进行,我也碰到这个问题,在动态sql中生成的
临时表不能在存储过程里引用,才采用生成一个很大的动态sql,在动态sql中返回结果。
如果谁有好方法,请告诉我

我查了SQL2000帮助,下面是帮助的内容:
在批处理、名称作用域和数据库上下文方面,sp_executesql 与 EXECUTE 的行为相同。
sp_executesql 批处理不能引用调用 sp_executesql 的批处理中声明的变量。
sp_executesql 批处理中的本地游标和变量对调用 sp_executesql 的批处理是不可见的。
对数据库上下文所作的更改只在 sp_executesql 语句结束前有效。
 
我有一个不怎么好的临时解决方案。
set @sqlString = N'declare cra cursor for select....'
exec(@sqlString)

open cra
fetch next from cra into @a
不知行的通否?
 
你可以采用一个变通的方法,
因为你的目的是想要得于满足条件的记录总条数,
所以这可以看成是一个返回值。按时函数的观点,
要得到返回值,一是用传出参数,一是函数的返回值,
所以,你可以在存储过程中再声明一个传出参数,然后将记录总数给它就行了。
 
一种可行的方法,我试过的。
declare @sql varchar(100),@v int
set @sql = 'select count(*) from zipinfotbl'
set @sql = 'declare test cursor for ' + @sql
exec(@sql)
open test
fetch next from test
into @v
select @v
close test
 
多人接受答案了。
 

Similar threads

后退
顶部