Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用表变量的SQL Server 2005存储过程不会将结果集返回到VB6应用程序_Sql_Sql Server 2005_Stored Procedures_Vb6_Resultset - Fatal编程技术网

使用表变量的SQL Server 2005存储过程不会将结果集返回到VB6应用程序

使用表变量的SQL Server 2005存储过程不会将结果集返回到VB6应用程序,sql,sql-server-2005,stored-procedures,vb6,resultset,Sql,Sql Server 2005,Stored Procedures,Vb6,Resultset,我有一个存储过程,它根据条件语句从一行中选择一个字段,并将其存储在局部变量中。基于此字段的值,我使用相同的条件语句更新表中相同行中的相同字段。因此,该过程首先对局部变量执行select操作,然后更新同一行的同一字段。然后,该过程通过选择表变量返回结果集,我也尝试使用临时表。结果集不包含我已更新的变量或字段。它甚至不包括此表中的任何字段 当从ManagementStudio或测试C应用程序调用该过程时,该过程正常工作。但是,从我的VB6应用程序调用时,不会返回结果集。但是,仍将执行所有数据库更新

我有一个存储过程,它根据条件语句从一行中选择一个字段,并将其存储在局部变量中。基于此字段的值,我使用相同的条件语句更新表中相同行中的相同字段。因此,该过程首先对局部变量执行select操作,然后更新同一行的同一字段。然后,该过程通过选择表变量返回结果集,我也尝试使用临时表。结果集不包含我已更新的变量或字段。它甚至不包括此表中的任何字段

当从ManagementStudio或测试C应用程序调用该过程时,该过程正常工作。但是,从我的VB6应用程序调用时,不会返回结果集。但是,仍将执行所有数据库更新

我尝试过用事务编写存储过程,但不使用事务,使用TRY…CATCH和不使用事务,同时使用事务和不使用事务。我尝试了各种事务隔离组合。不会引发异常,事务将始终提交。我还在select语句中使用了WITH NOLOCK提示。如果我不更新表,它会工作的。如果我省略了对局部变量的赋值,而改为硬编码一个值,它就会工作。如果我只是简单地使用select,我将把变量放在哪里,它将不起作用

有趣的是,如果我向过程中添加一些随机选择语句,它将返回该结果集。我甚至可以从分配给变量的同一条记录中选择相同的字段,没有问题。但是它仍然不会返回我想要的结果集

我的结果集是从一个表变量中选择的,该表变量通过insert语句填充,并在整个过程中使用变量集。根本没有表联接。我确实向过程传递了2个参数——其中一个用于原始select中的条件语句。但当我同时忽略参数和硬代码值时,仍然会得到相同的行为

我试过重新启动我的SQLServer2005版本9.0.4053,重新启动我的机器,我试过打开和关闭NOCOUNT,我基本上没有想法了

编辑-VB调用和存储过程签名的详细信息: 我将尽可能地给出一个描述,而不发布实际代码。我实际上是为另一个和我一起工作的开发人员发布这篇文章,所以请耐心听我说

VB6调用:

存储过程签名:

因此,本质上,这个过程需要两个参数。它执行许多简单的操作——从两个不同的表中插入和选择数据、更新表以及向表变量中插入行

该过程以从表变量中选择结束。这个过程或者来自VB6的调用没有什么特别之处。如前所述,观察到的行为是不寻常的,因为通过注释掉某些部分,调用和返回将起作用-返回数据。从C.NET测试应用程序调用相同的过程可以工作并成功返回所需的结果

我们在VB6应用程序中得到的只是一个空记录集


编辑2:我们刚刚发现,如果我们创建一个任意表来保存最终select语句返回的数据,而不是使用一个表变量,则该过程可以工作…

我们发现,由于从VB6调用该存储过程的方式,该存储过程实际上执行了两次:

With cmdCommand
        .ActiveConnection = cnnConn
        .CommandType = adCmdStoredProc
        .CommandText = "uspMyStoredProcedure"
        .Parameters("@strParam1") = strFunctionParameter1
        .Parameters("@bolParam2") = bolFunctionParameter2
        .Execute 
 End With

MyResultSet.CursorLocation = adUseClient
MyResultSet.Open cmdCommand, , adOpenStatic, adLockReadOnly 
第一次执行命令对象“cmdCommand”,显式调用作为“with”语句“.Execute”中的最后一行

我们发现最后一行:“MyResultSet.Open cmdCommand…”也隐式执行了第二次存储过程

由于存储过程的功能本质上是激活和停用报警,通过执行两次,我们得到了同时发生的激活和停用,因此没有返回结果集


希望这有助于避免其他人陷入这样的困境。

您能添加SQL和VB代码吗?我在VBA调用的存储过程中使用表变量…或者至少在存储过程签名和VB调用中使用表变量。。。
CREATE PROCEDURE uspMyStoredProcedure
    @strParam1 NVARCHAR(XX),
    @bolParam2 BIT

AS
BEGIN
    SET NO COUNT ON

    DECLARE @var1 NVARCHAR(XX),
    @var2 NVARCHAR(XX),
    @var3 NVARCHAR(XX),
    @var4 INT,
    @var5 BIT
    --DECLARATION OF OTHER VARIABLES


    DECLARE  @varTableVariable TABLE
    (
      strTblVar1 NVARCHAR(XX) ,
      intTblVar2 INT ,
      strTblVar3 NVARCHAR(XX) ,
      bolTblVar4 BIT ,
      datTblVar5 DATETIME
    )

    SELECT @var1 = t.Field1, @var2 = t.Field2
    FROM Table1 t
    WHERE t.ID = @strParam1

    SELECT @var3 = t2.Field1
    FROM Table2 t2

    IF (Condition)
    BEGIN
        SET @var4 = 1
        IF (Condition)
        BEGIN
            --SET SOME VARIABLES
        END
        ELSE
        BEGIN
            UPDATE TABLE1
            SET Field3 = @var4
            WHERE Field1 = @strParam1
        END
    END
    ELSE
    BEGIN
        IF(Condition)
        BEGIN
            SELECT @var5 = ISNULL(Condition)
            FROM Table3 t3
            WHERE t3.Field = @strParam1

            --SET SOME MORE VARIABLES
        END
    END

    IF(Condition)
    BEGIN
        UPDATE Table1
        SET Field5 = @SomeVariable
        WHERE Field1 = @strParam1
    END

    INSERT INTO Table4 (Field1, Field2, Field3)
    SELECT @SomeVar1, @someVar2, @SomeVar3
    FROM SomeOtherTable
    WHERE Field3 = @someVariable

    IF(Condition)
    BEGIN
        INSERT INTO @varTableVariable (strTblVar1, intTblVar2, 
        strTblVar3, bolTblVar4,  datTblVar5 )
        VALUES (@SomeVar1, @SomeVar2, @SomeVar3, @SomeVar4, @SomeVar5)
    END

SELECT *
FROM @varTableVariable

END
With cmdCommand
        .ActiveConnection = cnnConn
        .CommandType = adCmdStoredProc
        .CommandText = "uspMyStoredProcedure"
        .Parameters("@strParam1") = strFunctionParameter1
        .Parameters("@bolParam2") = bolFunctionParameter2
        .Execute 
 End With

MyResultSet.CursorLocation = adUseClient
MyResultSet.Open cmdCommand, , adOpenStatic, adLockReadOnly