sp_executesql执行的结果里有多条数据,我该如果取出全部记录呢?

luoqi 2005-04-18 06:46:10
...
FETCH NEXT FROM c_a INTO @cTableName,@cGameName

WHILE @@FETCH_STATUS = 0
BEGIN
set @s=N'select top 20 @uid=uid,
@gradename=gradename,
@grade=grade,
@score=score from '+@cTableName
if @cTableName=N't_1' or @cTableName=N't_2'
set @s=@s+N' order by money desc'
else
set @s=@s+N' order by grade desc,score desc'

exec sp_executesql @s,N'@uid varchar(100) output,
@gradename varchar(100) output,
@grade bigint output,
@score bigint output',
@uid output,@gradename output,@grade output,@score output

exec ph_getname @uid,@name output--自定义过程
exec ph_getschool @uid,@cSchoolName output--自定义过程
----怎么样才能获得这20条数据---
FETCH NEXT FROM c_a INTO @cTableName,@cGameName
END
...
...全文
305 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
brusehht 2005-08-25
  • 打赏
  • 举报
回复
邹建出来再把这个问题讲得清楚一点好吗,急需这个方案.
luoqi 2005-04-19
  • 打赏
  • 举报
回复
=======回: zjcxc(邹建)

在问题里面:

set @s=N'select top 20 .....'
exec sp_executesql @s....output...

执行后结果是不是应该有20条记录!
但是照该代码里,我一次只能取出第一条记录!

所以问题就在这里!
luoqi 2005-04-19
  • 打赏
  • 举报
回复
==========
使用表变量无法应用
Insert into exec **
Select table into **
不适合批量处理

而用临时表却:

Create table #tmp([name] nvarchar(100))
Declare @name nvarchar(100)

insert into #tmp exec ph_getname N'1008',@name output

select [name] from #tmp
--print @name
--Drop table #tmp
GO

同样要用DROP语句,而Select后结果为空(不是NULL,而是没有结果),过程返回值正常!
zjcxc 元老 2005-04-19
  • 打赏
  • 举报
回复
举例说明问题.
luoqi 2005-04-19
  • 打赏
  • 举报
回复
======回1,2,3楼,谢谢
但是代码里是在一个WHILE里,只定义一个表变量行吗?
如果只用一个变量,结果集会成倍增长,处理又变得麻烦!

如果要定义多个变量那又如何做?====我想这不太合适吧!
luoqi 2005-04-19
  • 打赏
  • 举报
回复
=======主  题: sp_executesql执行的结果里有多条数据,我该如果取出全部记录呢?

=======回: zjcxc(邹建)

=======应该指的是@s被执行后的结果集!!
zjcxc 元老 2005-04-19
  • 打赏
  • 举报
回复
--一个变量只能保存一个uid
--用游标

declare tb cursor local
for
select top 20 uid from table
open tb
fetch tb into @uid
while @@fetch_stauts=0
begin
--- 处理
fetch tb into @uid
end
close tb
deallocate tb
Well 2005-04-19
  • 打赏
  • 举报
回复
select uid into #t from table where 1<>1
declare @Sql varchar(800)
declare @str varchar(8000)
set @str='insert into #t(uid) '
set @Sql = ' SELECT top 20 uid FROM table
set @str=@str+@Sql
exec(@str)
luoqi 2005-04-19
  • 打赏
  • 举报
回复
----------------proc1
create table #t(uid varchar(100))

insert #t exec(N'select top 10 uid from table')
select * from #t
drop table #t

----这样可以得到结果集
-------------------proc2
create table #t(uid varchar(100))
Declare @s nvarchar(200),@uid varchar(20)

set @s=N'select top 10 @uid=uid from table'
insert #t exec sp_executesql @s,N'@uid varchar(20) output',@uid output
select * from #t
drop table #t
--------为什么这样不可以呢?
luoqi 2005-04-19
  • 打赏
  • 举报
回复
再就是,我这样用时:

set @s="select top 20 @uid=uid from table"
insert #t exec sp_executesql @s,N'@uid varchar(100) output',@uid output
select * from #t

为什么都是空的!?
luoqi 2005-04-19
  • 打赏
  • 举报
回复
非常感谢zjcxc(邹建)为我分忧!
但是,这样,得到的还是每个表里的第一行记录,而没有得到top 20的结果!

现在我把问题简化了:

set @s="select top 20 @uid=uid from table"
exec sp_executesql @s,N'@uid varchar(100) output',@uid output

真抱歉,我的表达能力有限,呵呵.

我是想得到前20个用户的UID,该怎么办?
zjcxc 元老 2005-04-19
  • 打赏
  • 举报
回复
...
FETCH NEXT FROM c_a INTO @cTableName,@cGameName

--定义一个保存数据的表变量
declare @t table(
uid varchar(100),
gradename varchar(100),
grade bigint,
score bigint
--还要保存什么自己添加
)

WHILE @@FETCH_STATUS = 0
BEGIN
set @s=N'select top 20 @uid=uid,
@gradename=gradename,
@grade=grade,
@score=score from '+@cTableName
if @cTableName=N't_1' or @cTableName=N't_2'
set @s=@s+N' order by money desc'
else
set @s=@s+N' order by grade desc,score desc'

exec sp_executesql @s,N'@uid varchar(100) output,
@gradename varchar(100) output,
@grade bigint output,
@score bigint output',
@uid output,@gradename output,@grade output,@score output

exec ph_getname @uid,@name output--自定义过程
exec ph_getschool @uid,@cSchoolName output--自定义过程
----怎么样才能获得这20条数据---

--先把数据存到表变量(对应要保存的变量)
insert @t select @uid,@gradename,@grade,@score

FETCH NEXT FROM c_a INTO @cTableName,@cGameName
END
--完成后显示结果
select * from @t
...
zjcxc 元老 2005-04-18
  • 打赏
  • 举报
回复
问题描述太模糊,处理中又涉及到不知道结构,也不知道需要什么结果的要求.
zjcxc 元老 2005-04-18
  • 打赏
  • 举报
回复
"怎么样才能获得这20条数据"

这20条数据指什么数据? 从那里来的? 调用存储过程返回的表集,还是指游标循环产生的结果.
talantlee 2005-04-18
  • 打赏
  • 举报
回复
用表變量
---這方法可以用一下
就是有點麻煩---用完要刪掉那表
---------------------------------還是叫個高手幫你弄個觸發器把
talantlee 2005-04-18
  • 打赏
  • 举报
回复
1.先建立一个临时表,该表与执行存储过程后所反回的表结果集结构想同---
2.调用
insert into #temptable exec @uid,@name output
-----你這樣在存儲過程裡建立臨時表保持結果的話,隻要存儲過程一結束,它會給系統自動刪除
zhaovbo 2005-04-18
  • 打赏
  • 举报
回复
用表變量
wudan8057 2005-04-18
  • 打赏
  • 举报
回复
1.先建立一个临时表,该表与执行存储过程后所反回的表结果集结构想同
2.调用
insert into #temptable exec @uid,@name output

34,575

社区成员

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

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