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