在客户端我用ADO执行了两个带存储过程的SQL语句,
两个存储过程都是类假如下的结构:
declare MYCUR CURSOR
FOR (SELECT A FROM TB)
OPEN MYCUR 
FETCH NEXT FROM MYCUR INTO @A
while @@fetch_status = 0
begin
update tb set I=I+1 where a=@A
FETCH NEXT FROM MYCUR INTO @A
end
Close MYCUR
DEALLOCATE MYCUR然后客户端ADO 记录集打开一个多条TSQL语句的查询,类似这样:
set nocount on
select @a = a from TBA
select @b = b from TBB
select @C= @a -@b
select @C AS C
set nocount off
客户端记录集在打开后读C时,出现错误,说类型不匹配,调试时我发现前面去掉一个存储过程就正确了,这是什么异常的情况啊,请教各位大神们?????

解决方案 »

  1.   

    LZ用ADO执行的多条SQL语句,没有涉及调用存储过程的呀?
      

  2.   

    DECLARE  @I INT  --循环变量
    DECLARE  @count INT --记录数
    DECLARE  @PartID INT --临时存放idDECLARE  @tmp VARCHAR(50)DECLARE  @tmpDB TABLE (ID INT IDENTITY(1,1) PRIMARY KEY,PartID INT) --创建表变量INSERT INTO  @tmpDB SELECT ID FROM TEST2 --将表ID添加入表变量
                                                                
    SELECT @count = COUNT(1)  FROM   @tmpDB --查询出表变量的记录数                                                       
    IF  @count >0
    BEGIN
    SET @i = 1 --初始化循环变量
    WHILE (@I <= @count ) 
    BEGIN
    SELECT @PartID = PartID FROM @tmpDB WHERE ID = @I  --查出第一个子标ID

    SELECT @tmp = A  FROM  TEST2 WHERE ID =@PartID
    --PRINT @I
    PRINT @tmp

    SELECT @I =@I+1  --循环递增
    END

    END                                                           
                   
    我估计是那个该死的游标,因两个存储过程中都有用到游标,估计是资源死锁了,请问下大牛对不对?
    我现在自己写了一个代替方案,如上,请教大牛,这样可以么?
      

  3.   

    DECLARE  @I INT  --循环变量
    DECLARE  @count INT --记录数
    DECLARE  @PartID INT --临时存放idDECLARE  @tmp VARCHAR(50)DECLARE  @tmpDB TABLE (ID INT IDENTITY(1,1) PRIMARY KEY,PartID INT) --创建表变量INSERT INTO  @tmpDB SELECT ID FROM TEST2 --将表ID添加入表变量
                                                                
    SELECT @count = COUNT(1)  FROM   @tmpDB --查询出表变量的记录数                                                       
    IF  @count >0
    BEGIN
    SET @i = 1 --初始化循环变量
    WHILE (@I <= @count ) 
    BEGIN
    SELECT @PartID = PartID FROM @tmpDB WHERE ID = @I  --查出第一个子标ID

    SELECT @tmp = A  FROM  TEST2 WHERE ID =@PartID
    --PRINT @I
    PRINT @tmp

    SELECT @I =@I+1  --循环递增
    END

    END                                                           
                   
    我估计是那个该死的游标,因两个存储过程中都有用到游标,估计是资源死锁了,请问下大牛对不对?
    我现在自己写了一个代替方案,如上,请教大牛,这样可以么?

    看语法应该没什么问题.
      

  4.   

    是不是要在每个存储过程开始写上 set nocount on , 在结束写上 set nocount off 呢?