【问题标题】:Limits for executing stored procedure with parameter through Excel ADO connection通过 Excel ADO 连接执行带参数存储过程的限制
【发布时间】:2017-11-06 10:23:37
【问题描述】:

我遇到了通过 Excel ADO 在 SQL Server 上执行存储过程的意外行为。存储过程有一个字符串参数。如果 sp 的参数很短 - 最多 400 万个字符 - 一切正常。

当字符串参数为 e.i. 时问题开始。 900 万个字符。 我已经确定,当我在 sp 开头通过这段代码捕获参数时,ADO 肯定可以穿透 SQL 服务器:

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 可能并不重要,但以防万一它出现在 Stackoverflow 上的答案 here。当然,sp 本身是可以的,因为我可以像这样从 SSMS 调用它:

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

并且查询正确执行,对参数大小没有任何限制。

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

【问题讨论】:

  • 一种不同的技术可能会使您受益更多,但我会做一些研究/问另一个问题,以指定您实际尝试做什么。有很多 ETL 工具,这取决于它是否必须在 Excel 打开的情况下完成,或者您是否可以使用计划加载,或者......有很多不同的答案。 900 万个字符是传递给 SQL 服务器的一个非常大的参数。另外你的另一个问题是关于拆分字符串,这个问题被标记为 SQL 2016,它有一个 STRING_SPILT() 函数docs.microsoft.com/en-us/sql/t-sql/functions/…

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-27
    • 2013-11-24
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多