传递给 ADODB 的查询长度是不是有限制?
Posted
技术标签:
【中文标题】传递给 ADODB 的查询长度是不是有限制?【英文标题】:Is there a limit to the query length being passed to ADODB?传递给 ADODB 的查询长度是否有限制? 【发布时间】:2017-06-29 19:50:33 【问题描述】:我目前正在测试一个框架,该框架将 SQL 查询存储在 Excel 工作簿的单元格中,然后将单元格值传递给变量。然后通过rs.Open query, cn
执行此变量,其中:
Dim rs As ADODB.Recordset
Dim cn As ADODB.Connection
我已经尝试过这些“查询”:
Dim query as String
Dim query as Variant
甚至使用固定长度的查询:
Dim query as String * 9999
在处理查询字符串的输出时,它会在 8000 左右切断。谷歌对我来说太短了,所以我来这里寻求答案。变量可以传递给recordset.Open()
的内容是否有特定限制?
注意:我用于此特定查询的连接字符串是: ConnectionString = "用户 ID=用户;密码=PW;数据源=DB;提供者=OraOLEDB.Oracle"
但是,如果您知道 Oracle、NetezzaSQL 或 MS SQL Server (SQLOLEDB.1) 是否存在系统特定限制,请告诉我。我需要指定每个的限制,以便定义哪些新查询需要转换为存储过程。
这里是代码的要点:
Sub RunQueryTable()
Dim cn As ADODB.Connection
Dim RS As ADODB.Recordset
Dim iCols As Integer
Dim DB As String, User As String, PW As String
Dim SQLTable As Worksheet
Dim ConnectionString as String
Dim query As String 'Or Dim query As Variant 'Or Dim query As String * 9999
Dim i As Long
etc, etc.
Set SQLTable = Sheet32
Set cn = New ADODB.Connection
Set RS = New ADODB.Recordset
DB = _____
User = ______
PW = ____
ConnectionString = "User ID=" & User & _
";Password=" & PW & _
";Data Source=" & DB & _
";Provider=OraOLEDB.Oracle"
query = SQLTable.Cells(i, 3).Text
cn.Open (ConnectionString)
RS.CursorType = adOpenForwardOnly
RS.Open (query), cn
For iCols = 0 To RS.Fields.count - 1
Worksheets("Output").Cells(1, iCols + 1).Value = RS.Fields(iCols).Name
Next
Worksheets("Output").Cells(2, "A").CopyFromRecordset RS
RS.Close
cn.Close
End Sub
我从 VBA 得到的具体错误是:“ORA-00923:FROM 关键字未在预期的地方找到”,因为查询被中断了。
【问题讨论】:
请添加您的实际代码和您正在使用的数据库。 为什么你的 VBA 代码中有一个 8K+ 字符的内联 SQL 查询??!!听说过存储过程吗?他们创造奇迹! 说 8K 字符是有道理的,那就是nvarchar(max)
(假设 SQL Server - 请 edit 你的问题澄清)。可能由服务器驱动,而不是 ADODB。
查询在 Toad 中运行良好,这是我在这里感到困惑的一部分。
@Mat'sMug - ...where myField in ([long list of values sourced from worksheet])...
是我经常做的事情。从理论上讲,您可以将所有这些值插入到表中并执行连接,但有时基本方法可以正常工作。
【参考方案1】:
这是你的问题:
query = SQLTable.Cells(i, 3).Text
考虑:
Range("A1").Value=string(12000,"*")
? len(range("a1").value) '>> 12000
? len(range("a1").text) '>> 8221
【讨论】:
不错的一个!我仍然认为除了琐碎的查询之外没有任何东西是一个很好的可维护解决方案。编辑超过 8000 个字符的查询是在 SSMS 中完成的(或者任何你用来用你最喜欢的 RDBMS 编辑 SQL 的东西),而不是 Excel 单元格;无法摆脱它们应该是存储过程的感觉。 同意 - 我所有的大型查询通常都是由于使用了“in”列表。 @TimWilliams 如果我正确理解您的答案,请告诉我:本质上,您将单元格的长度设置为 12,000 个字符的固定长度。完成此操作后,我能否将更长的字符串长度传递给可用于打开记录集的变量? 不,我的意思是,如果您使用.Text
从存储它的单元格中读取长 SQL 查询,如果它的长度超过 8221 个字符,您可能无法获得完整的 SQL。您应该改用.Value
。我贴的那三行代码只是为了说明使用.Text
的问题以上是关于传递给 ADODB 的查询长度是不是有限制?的主要内容,如果未能解决你的问题,请参考以下文章