日期:2014-05-18  浏览次数:20527 次

table变量 存储过程返回数据
CREATE   PROCEDURE   sp_getAllMT
AS
declare   @tbl   table(
mtid   int,
mtname   varchar(50),
orderid   int
)
insert   into   @tbl   values(0, '供应 ',0)
insert   into   @tbl   select   mtid,mtname,orderid   from   tbl_messagetype   where   mtid <50   order   by   orderid   asc
insert   into   @tbl   values(0, '求购 ',50)
insert   into   @tbl   select   mtid,mtname,orderid   from   tbl_messagetype   where   mtid> 50   order   by   orderid   asc
select   *   from   @tbl
GO
--------------------------------
CREATE   PROCEDURE   sp_getAllMT
AS
select   mtid,mtname,orderid   from   tbl_messagetype     order   by   orderid   asc
GO
----------------------------------
上面的两个存储过程返回的结果有什么不同?
我在程序中用set   rs   =   conn.execute( "sp_getAllMT ")用第二个是正确的,第一个错误,提示 "对象关闭时,不允许操作。 ",在查询分析器中两个存储过程都可以执行,返回预期的结果

------解决方案--------------------
在第一个存储过程的定义的第一行加入set nocount on,以禁止回显:
CREATE PROCEDURE sp_getAllMT
AS
SET NOCOUNT ON /*加上此行*/
delcare ...
------解决方案--------------------
第二个也有回显,但是该回显是在返回的结果中的第二个结果集中,而查询的记录在第一个结果集中,所以该回显不会影响读取结果集.
第一个存储过程中的在查询之前就因为有insert操作而产生回显了,所以第一个结果集不是想要的.