2

非常感谢 jacouh(VBA Copy & Paste 3000 rows)对我最初的问题的回答。在论坛的帮助下,我现在有了下面的代码,它从 Excel 文件中插入了 2999 行。每行是INSERT (X, Y, Z, ...) VALUES (X1, Y1, Z1,...) into DBNAME.TABLE. 虽然它有效,但它非常缓慢。据我了解,我可以通过增加缓冲区的大小来提高插入速度,如http://developer.teradata.com/doc/connectivity/tdnetdp/13.11/webhelp/Teradata.Client.Provider~Teradata中所述.Client.Provider.TdConnectionStringBuilder~ResponseBufferSize.html. 我试图合并它并失败了。有人可以推荐一个可能的集成来增加响应缓冲区的大小。太感谢了。我之前探索过不同的论坛,这绝对是最好的。确实。任何其他想法,比我目前使用的更好(将大约 3000 行插入大约 15 个不同的表中),然后请告诉我!)

Sub Insert_to_TD()

Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
Dim cmdsqldata As ADODB.Command
Set cmdsqldata = New ADODB.Command

Dim i, strSQL

cn.Open "DSN=NNNNNN; Username=XXXXX; Password=YYYYYYY;"


Set cmdsqldata.ActiveConnection = cn

cmdsqldata.CommandType = adCmdText
cmdsqldata.CommandTimeout = 0

For i = 1 To 2999
strSQL = ActiveSheet.Cells(i, 1).Value
cmdsqldata.CommandText = strSQL
Set rs = cmdsqldata.Execute()
Next


End Sub
4

2 回答 2

2

Teradata 可以并行插入数据行(例如在 Teradata SQL 助手中按 F9)。您可以提交最长为 1 MB 的查询,其中多个语句用分号分隔,例如:

"INSERT (X, Y, Z, ...) VALUES (X1, Y1, Z1,...) into DBNAME.TABLE;
INSERT (X, Y, Z, ...) VALUES (X1, Y1, Z1,...) into DBNAME.TABLE;    
INSERT (X, Y, Z, ...) VALUES (X1, Y1, Z1,...) into DBNAME.TABLE;
INSERT (X, Y, Z, ...) VALUES (X1, Y1, Z1,...) into DBNAME.TABLE;"

一次将可能有 500 行的整个字符串放入 strSQL 中,然后您只需要循环并执行 6 条语句即可处理所有 3000 行。这应该可以将您的过程加速至少 10 倍。非单线程语言或 VBA 的一些技巧将允许您一次向 Teradata 发送多个这些语言,这可以让您额外获得 10 倍,具体取决于您的 Teradata 服务器的容量和允许的连接数。

但 Rob 与其他 Teradata 实用程序走上了正轨。这些存在是有原因的,那就是 VBA-teradata 操作既困难又缓慢。

于 2014-07-22T18:18:34.137 回答
2

我建议您考虑在您的 VB 代码中使用带有参数的准备好的语句。然后你有几个选择:

  1. 使用参数一次循环遍历 Excel 工作表并分配参数值并执行迭代,就像您在上面的原始代码示例中一样。这将比您的原始代码更快。
  2. 如果可能(我的 ADO 和 VB 编码技能生疏)创建一个参数数组,定义 Excel 工作表中的所有行和列,并对数据库执行单个批处理语句。这将是将数据应用到数据库的最快方法。

我相信有很多例子可以说明如何使用我在 SO 上的 ADO/VB 代码中建议的任何一种方法,或者如果你遇到困难,可以使用谷歌搜索。

或者,您可以获取 Excel 工作表并将其另存为 CSV,该 CSV 可用作 Teradata 实用程序之一的源,例如 BTEQ、FastLoad、MultiLoad 或 Teradata Parallel Transport。

于 2013-11-13T14:12:16.463 回答