存储过程如下:
Create PROCEDURE pr_rsTest
AS
Declare @SQL nvarchar(4000)
Set @SQL='select * from tb_test'
-- @SQL是根据传入参数动态组合的,此仅为示例
exec (@SQL) --如果以EXEC方式执行,总是不能返回数据集
GO
26 个解决方案
#1
exec pr_rsTest
#2
将存储过程中的结果插入一临时表,然后从临时表取数据.
#3
dawugui,我考虑过你所说的做法,但我的存储过程需要对多个不同结构的表进行操作,建临时表的话实在是很麻烦,如果能够不用建临时表,直接返回结果集是最好的
#4
select * into #tbtest from tb_test where 1<>1 --先建个返回记录集一样结构的临时表
insert into #tbtest exec pr_rsTest--把返回的结果报错到临时表里
select * from #tbtest--对临时表操作
drop table #tbtest
Create PROCEDURE pr_rsTest
AS
Declare @SQL nvarchar(4000)
Set @SQL='select * from tb_test'
-- @SQL是根据传入参数动态组合的,此仅为示例
exec (@SQL) --如果以EXEC方式执行,总是不能返回数据集
#5
exec pr_rsTest
#6
对多个不同结构的表进行操作
就建一个 和你返回结果集一样结构的就可以了
就建一个 和你返回结果集一样结构的就可以了
#7
kk19840210,还是有问题,如你所说:
但表名在存储过程内并不知道,无法事先创建
我的示例写得太匆忙了,可能没把问题表述清楚,我再完善一下:
select * into #tbtest from tb_test where 1<>1 --先建个返回记录集一样结构的临时表
但表名在存储过程内并不知道,无法事先创建
我的示例写得太匆忙了,可能没把问题表述清楚,我再完善一下:
Create PROCEDURE pr_rsTest
@tblName varchar(255), -- 表名
@fields varchar(1000) = '*' -- 需要返回的列
AS
Declare @SQL nvarchar(4000)
Set @SQL='select '+fields+' from '+@tblName
-- @SQL是根据传入参数动态组合的,存储过程事先不知道表名和字段表
exec (@SQL) --如果以EXEC方式执行,总是不能返回数据集
GO
--执行存储过程:
exec pr_rsTest 'tb_test','f1,f2'
#8
这样可以返回数据集啊。怎么不能返回呢?
#9
我也觉得奇怪,我在查询分析器中是可以正常看到结果的,但在vs2005中用sqlDataSource来执行这个存储过程,却总是提示“该查询没有返回任何数据表”!
#10
程序有问题吧。。这个完全可以返回的。检查下程序逻辑吧。
#11
加一句:
set nocount on
吧.
set nocount on
吧.
#12
还有,在真正想要的输出语句前再加一句:
set nocount off
具体作用,可是查帮助.
另外,好象不是这里的问题,
却总是提示“该查询没有返回任何数据表”!
这种提示好象是没有得到记录集.
应该是前台程序有问题.
set nocount off
具体作用,可是查帮助.
另外,好象不是这里的问题,
却总是提示“该查询没有返回任何数据表”!
这种提示好象是没有得到记录集.
应该是前台程序有问题.
#13
前台并没有任何程序语句,而SqlDataSource是通过设计器进行配置的,下面是aspx的代码段:
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:sqlConnectionString1 %>"
SelectCommand="pr_rsTest" SelectCommandType="StoredProcedure" EnableCaching="True">
<SelectParameters>
<asp:Parameter DefaultValue="v_tickets" Name="tblName" Type="String" />
<asp:Parameter Name="fields" Type="String" DefaultValue="" />
</SelectParameters>
</asp:SqlDataSource>
--------
hui_hui_2007,我加了set nocount off/on都没有用
问题应该出在“exec(@strSQL)”这里,但我又必须动态生成select语句来执行,实在是很难办
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:sqlConnectionString1 %>"
SelectCommand="pr_rsTest" SelectCommandType="StoredProcedure" EnableCaching="True">
<SelectParameters>
<asp:Parameter DefaultValue="v_tickets" Name="tblName" Type="String" />
<asp:Parameter Name="fields" Type="String" DefaultValue="" />
</SelectParameters>
</asp:SqlDataSource>
--------
hui_hui_2007,我加了set nocount off/on都没有用
但是修改存储过程,取消exec方式是有效的:
Create PROCEDURE pr_rsTest
@tblName varchar(255), -- 表名
@fields varchar(1000) = '*' -- 需要返回的列
AS
Declare @SQL nvarchar(4000)
Set @SQL='select '+fields+' from '+@tblName
-- @SQL是根据传入参数动态组合的,存储过程事先不知道表名和字段表
-- exec (@SQL) --如果以EXEC方式执行,总是不能返回数据集
select * from tb_test --如果直接查询,用sqlDataSource设计器中的“测试查询”是能够正确返回数据集的
GO
问题应该出在“exec(@strSQL)”这里,但我又必须动态生成select语句来执行,实在是很难办
#14
笔误:
Set @SQL='select '+fields+' from '+@tblName
--->
Set @SQL='select '+@fields+' from '+@tblName
#15
-- testproc
alter proc testproc
as
begin
declare @sql varchar(100)
set @sql='select * from tb'
exec(@sql)
end
--
完全可以啊~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alter proc testproc
as
begin
declare @sql varchar(100)
set @sql='select * from tb'
exec(@sql)
end
--
完全可以啊~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#16
可以
执行存储过程就可以返回数据集
执行存储过程就可以返回数据集
#17
Set @SQL='select '+fields+' from '+@tblName
----------------
不太对吧。fields是什么,
你这样,
print @sql
然后看看是什么,拷这个串到查询分析器中执行。
看看能否成功。
应该完全可以的,我可以断定,你的字串拼的不对。
----------------
不太对吧。fields是什么,
你这样,
print @sql
然后看看是什么,拷这个串到查询分析器中执行。
看看能否成功。
应该完全可以的,我可以断定,你的字串拼的不对。
#18
print @sql
然后将字串贴上来,定能发现问题。
然后将字串贴上来,定能发现问题。
#19
fields我少写了一个@,14楼我已经说明了
我想应该是.net中的SqlDataSource设置不对,或是在.net中的调用方式不对,但不知道具体问题在哪里。
我已经在ASP.net区新开了帖,大家一起讨论。
http://topic.csdn.net/u/20080110/11/f5c8efed-6425-44d5-96e8-7bb9fec91d03.html
--在查询分析器中执行存储过程,没有任何错误,可以得到结果:
exec pr_rsTest 'tb_test'
我想应该是.net中的SqlDataSource设置不对,或是在.net中的调用方式不对,但不知道具体问题在哪里。
我已经在ASP.net区新开了帖,大家一起讨论。
http://topic.csdn.net/u/20080110/11/f5c8efed-6425-44d5-96e8-7bb9fec91d03.html
#20
生命周期问题,exec是新的容器中 里面所有的东西随着exec结束而结束 我觉得 只有临时表
#21
superkitten,你说的问题我也考虑过,但为什么我用ASP+RecordSet做测试,却能得到数据集呢?
用Delphi的ADO控件也可以得到数据。
是不是ADO和ADO.net对存储过程的调用有区别?
用Delphi的ADO控件也可以得到数据。
是不是ADO和ADO.net对存储过程的调用有区别?
#22
SP_EXECUTESQL
#23
lz 你不用SqlDataSource,用SqlCommand 试下
#24
唉,终于知道是哪里的问题了!
原来是SqlDataSource的参数必须全部填写DefaultValue,而且不能为空,否则就不行。系统也不会提示出错,只是查不出数据来。
我就漏了一个参数未填,害得我测试了两天才搞定。
SqlDataSource的代码改一下这行:
<asp:Parameter Name="fields" Type="String" DefaultValue="*" />
郁闷,结帖散分了!
原来是SqlDataSource的参数必须全部填写DefaultValue,而且不能为空,否则就不行。系统也不会提示出错,只是查不出数据来。
我就漏了一个参数未填,害得我测试了两天才搞定。
SqlDataSource的代码改一下这行:
<asp:Parameter Name="fields" Type="String" DefaultValue="*" />
郁闷,结帖散分了!
#25
解决了终归是好事嘛~ 就别郁闷了
#26
EXEC Sp_Public_GetDJBH @DJBH = @DJBH OUTPUT
#1
exec pr_rsTest
#2
将存储过程中的结果插入一临时表,然后从临时表取数据.
#3
dawugui,我考虑过你所说的做法,但我的存储过程需要对多个不同结构的表进行操作,建临时表的话实在是很麻烦,如果能够不用建临时表,直接返回结果集是最好的
#4
select * into #tbtest from tb_test where 1<>1 --先建个返回记录集一样结构的临时表
insert into #tbtest exec pr_rsTest--把返回的结果报错到临时表里
select * from #tbtest--对临时表操作
drop table #tbtest
Create PROCEDURE pr_rsTest
AS
Declare @SQL nvarchar(4000)
Set @SQL='select * from tb_test'
-- @SQL是根据传入参数动态组合的,此仅为示例
exec (@SQL) --如果以EXEC方式执行,总是不能返回数据集
#5
exec pr_rsTest
#6
对多个不同结构的表进行操作
就建一个 和你返回结果集一样结构的就可以了
就建一个 和你返回结果集一样结构的就可以了
#7
kk19840210,还是有问题,如你所说:
但表名在存储过程内并不知道,无法事先创建
我的示例写得太匆忙了,可能没把问题表述清楚,我再完善一下:
select * into #tbtest from tb_test where 1<>1 --先建个返回记录集一样结构的临时表
但表名在存储过程内并不知道,无法事先创建
我的示例写得太匆忙了,可能没把问题表述清楚,我再完善一下:
Create PROCEDURE pr_rsTest
@tblName varchar(255), -- 表名
@fields varchar(1000) = '*' -- 需要返回的列
AS
Declare @SQL nvarchar(4000)
Set @SQL='select '+fields+' from '+@tblName
-- @SQL是根据传入参数动态组合的,存储过程事先不知道表名和字段表
exec (@SQL) --如果以EXEC方式执行,总是不能返回数据集
GO
--执行存储过程:
exec pr_rsTest 'tb_test','f1,f2'
#8
这样可以返回数据集啊。怎么不能返回呢?
#9
我也觉得奇怪,我在查询分析器中是可以正常看到结果的,但在vs2005中用sqlDataSource来执行这个存储过程,却总是提示“该查询没有返回任何数据表”!
#10
程序有问题吧。。这个完全可以返回的。检查下程序逻辑吧。
#11
加一句:
set nocount on
吧.
set nocount on
吧.
#12
还有,在真正想要的输出语句前再加一句:
set nocount off
具体作用,可是查帮助.
另外,好象不是这里的问题,
却总是提示“该查询没有返回任何数据表”!
这种提示好象是没有得到记录集.
应该是前台程序有问题.
set nocount off
具体作用,可是查帮助.
另外,好象不是这里的问题,
却总是提示“该查询没有返回任何数据表”!
这种提示好象是没有得到记录集.
应该是前台程序有问题.
#13
前台并没有任何程序语句,而SqlDataSource是通过设计器进行配置的,下面是aspx的代码段:
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:sqlConnectionString1 %>"
SelectCommand="pr_rsTest" SelectCommandType="StoredProcedure" EnableCaching="True">
<SelectParameters>
<asp:Parameter DefaultValue="v_tickets" Name="tblName" Type="String" />
<asp:Parameter Name="fields" Type="String" DefaultValue="" />
</SelectParameters>
</asp:SqlDataSource>
--------
hui_hui_2007,我加了set nocount off/on都没有用
问题应该出在“exec(@strSQL)”这里,但我又必须动态生成select语句来执行,实在是很难办
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:sqlConnectionString1 %>"
SelectCommand="pr_rsTest" SelectCommandType="StoredProcedure" EnableCaching="True">
<SelectParameters>
<asp:Parameter DefaultValue="v_tickets" Name="tblName" Type="String" />
<asp:Parameter Name="fields" Type="String" DefaultValue="" />
</SelectParameters>
</asp:SqlDataSource>
--------
hui_hui_2007,我加了set nocount off/on都没有用
但是修改存储过程,取消exec方式是有效的:
Create PROCEDURE pr_rsTest
@tblName varchar(255), -- 表名
@fields varchar(1000) = '*' -- 需要返回的列
AS
Declare @SQL nvarchar(4000)
Set @SQL='select '+fields+' from '+@tblName
-- @SQL是根据传入参数动态组合的,存储过程事先不知道表名和字段表
-- exec (@SQL) --如果以EXEC方式执行,总是不能返回数据集
select * from tb_test --如果直接查询,用sqlDataSource设计器中的“测试查询”是能够正确返回数据集的
GO
问题应该出在“exec(@strSQL)”这里,但我又必须动态生成select语句来执行,实在是很难办
#14
笔误:
Set @SQL='select '+fields+' from '+@tblName
--->
Set @SQL='select '+@fields+' from '+@tblName
#15
-- testproc
alter proc testproc
as
begin
declare @sql varchar(100)
set @sql='select * from tb'
exec(@sql)
end
--
完全可以啊~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alter proc testproc
as
begin
declare @sql varchar(100)
set @sql='select * from tb'
exec(@sql)
end
--
完全可以啊~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#16
可以
执行存储过程就可以返回数据集
执行存储过程就可以返回数据集
#17
Set @SQL='select '+fields+' from '+@tblName
----------------
不太对吧。fields是什么,
你这样,
print @sql
然后看看是什么,拷这个串到查询分析器中执行。
看看能否成功。
应该完全可以的,我可以断定,你的字串拼的不对。
----------------
不太对吧。fields是什么,
你这样,
print @sql
然后看看是什么,拷这个串到查询分析器中执行。
看看能否成功。
应该完全可以的,我可以断定,你的字串拼的不对。
#18
print @sql
然后将字串贴上来,定能发现问题。
然后将字串贴上来,定能发现问题。
#19
fields我少写了一个@,14楼我已经说明了
我想应该是.net中的SqlDataSource设置不对,或是在.net中的调用方式不对,但不知道具体问题在哪里。
我已经在ASP.net区新开了帖,大家一起讨论。
http://topic.csdn.net/u/20080110/11/f5c8efed-6425-44d5-96e8-7bb9fec91d03.html
--在查询分析器中执行存储过程,没有任何错误,可以得到结果:
exec pr_rsTest 'tb_test'
我想应该是.net中的SqlDataSource设置不对,或是在.net中的调用方式不对,但不知道具体问题在哪里。
我已经在ASP.net区新开了帖,大家一起讨论。
http://topic.csdn.net/u/20080110/11/f5c8efed-6425-44d5-96e8-7bb9fec91d03.html
#20
生命周期问题,exec是新的容器中 里面所有的东西随着exec结束而结束 我觉得 只有临时表
#21
superkitten,你说的问题我也考虑过,但为什么我用ASP+RecordSet做测试,却能得到数据集呢?
用Delphi的ADO控件也可以得到数据。
是不是ADO和ADO.net对存储过程的调用有区别?
用Delphi的ADO控件也可以得到数据。
是不是ADO和ADO.net对存储过程的调用有区别?
#22
SP_EXECUTESQL
#23
lz 你不用SqlDataSource,用SqlCommand 试下
#24
唉,终于知道是哪里的问题了!
原来是SqlDataSource的参数必须全部填写DefaultValue,而且不能为空,否则就不行。系统也不会提示出错,只是查不出数据来。
我就漏了一个参数未填,害得我测试了两天才搞定。
SqlDataSource的代码改一下这行:
<asp:Parameter Name="fields" Type="String" DefaultValue="*" />
郁闷,结帖散分了!
原来是SqlDataSource的参数必须全部填写DefaultValue,而且不能为空,否则就不行。系统也不会提示出错,只是查不出数据来。
我就漏了一个参数未填,害得我测试了两天才搞定。
SqlDataSource的代码改一下这行:
<asp:Parameter Name="fields" Type="String" DefaultValue="*" />
郁闷,结帖散分了!
#25
解决了终归是好事嘛~ 就别郁闷了
#26
EXEC Sp_Public_GetDJBH @DJBH = @DJBH OUTPUT