通过Excel ADO连接使用参数执行存储过程的限制

时间:2017-11-06 10:23:38

标签: sql vba excel-vba ado sql-server-2016

我通过Excel ADO在SQL Server上执行存储过程的意外行为。存储过程有一个字符串参数。如果sp的参数很短 - 高达4个百万字符 - 一切正常。

当string参数为e.i时,问题开始。 9个百万字符。 我已经确定ADO可以穿透到SQL服务器,因为我在sp的开头通过此代码捕获参数:

create procedure MyStoredProcedure(@String nvarchar(max)) 
as 
if OBJECT_ID('dbo.temp', 'U') is not null drop table dbo.temp;
select [String]=@String into dbo.temp

但是,在通过Excel ADO调用的sp中无法进一步处理参数。详细的sp可能并不重要,但以防万一它在回答here中的Stackoverflow上呈现。当然,sp本身还可以,因为我可以这样从SSMS调用它:

declare @String nvarchar(max)
set @String=(select top 1 [String] from dbo.temp);
exec dbo.MyStoredProcedure @String

并且查询正确执行,不受参数大小的任何限制。

通过Excel ADO执行存储过程是否有任何限制 - 如参数长度限制,查询限制,时间限制?

1 个答案:

答案 0 :(得分:0)

想出来。我在VBA错误捕获中打开了选项Break on all errors,它立刻向我展示了流氓。错误消息为Run-time error '-2147217908 (80040e31)'。我想超时的默认值必须是30秒。通过ADO连接执行的查询超出了该时间,因为参数字符串长度超过了9百万个字符。我把时间设置为120秒,问题解决了。

Dim cmd As Object
Set cmd = CreateObject("ADODB.Command")  
    cmd.CommandTimeout = 120 'This line solved the problem

无论如何,了解ADO连接限制列表仍然很有价值,甚至是那些使用默认值设置的限制。