繁体   English   中英

如何仅在VBA逗号分隔列表中的字符串(而不是数字)上放置引号?

[英]How to put quotes only on strings (not on numbers) in a VBA comma-separated list?

上下文:我想在PostgreSQL数据库中导入Excel电子表格中的一些数据。 为此,我在VBA中建立了与数据库的连接,现在,我想为每个行执行一个INSERT SQL查询,例如

INSERT INTO mytable VALUES ('a','b',32,'d',17.2);

如果我们假设一个包含5列的pgSQL表,其中2列是数字的。

使用数组和VBA join函数我已经想出了如何获取Excel表格的给定行并将其转换为引用每个项目的列表,例如

('a','b','32','d','17.2');

从中我可以轻松编写SQL查询。

引用所有项目的缺点是,在插入时,postgreSQL服务器必须将已经作为字符串传递的数值再次转换回数值。 我担心这会影响性能,特别是在需要处理50000多行的情况下。


问题:在这种情况下,我想找到一种解决方案,在将VBA数组转换为以逗号分隔的列表而不在列上使用For循环时,仅将引号放在非数值上,这也可能影响性能。

我将当前水平Excel范围转换为此类列表的当前VBA代码为:

myArray = Application.Transpose(Application.Transpose(myRange.Value))
myList = "('" & Join(myArray, "','") & "')"

(在上面的例子中, myArray将是一个包含值的VBA数组(“a”,“b”,32,“d”,17.2))。

在Join之前花几毫秒来转换数组。

Dim myarray As Variant, mylist As String, i As Long

myarray = Application.Transpose(Application.Transpose(Range("a1:f1").Value2))

For i = LBound(myarray) To UBound(myarray)
    If Not IsNumeric(myarray(i)) Then _
        myarray(i) = Chr(39) & Trim(myarray(i)) & Chr(39)
Next i

mylist = "(" & Join(myarray, Chr(44)) & ")"
Debug.Print mylist

使用带缓冲区的循环来构建SQL。 您不会注意到性能上的差异。 您还可以更好地控制类型,如果字符串包含一个,您将能够转义引号:

Sub Test()
  Dim data()
  data = [{ "a",1 ; "b",2 }]
  Debug.Print ToSqlInsert("MyTable (Col1, Col2)", data)
End Sub


Public Function ToSqlInsert(target As String, data()) As String
  Dim sb() As String, n As Long, r As Long, c As Long
  ReDim sb(0 To UBound(data, 1) * UBound(data, 2) * 2)

  sb(n) = "INSERT INTO " & target & " VALUES ("
  n = n + 1

  For r = 1 To UBound(data, 1)
    For c = 1 To UBound(data, 2)
      If c > 1 Then sb(n - 1) = ","

      Select Case VBA.VarType(data(r, c))
        Case vbString:  sb(n) = "'" & Replace$(data(r, c), "'", "''") & "'"
        Case vbDate:    sb(n) = Int((data(r, c) - #1/1/1970#) * 86400) ' to epoche '
        Case vbEmpty:   sb(n) = "NULL"
        Case Else:      sb(n) = data(r, c)
      End Select

      n = n + 2
    Next

    sb(n - 1) = "),("
  Next

  sb(n - 1) = ");"
  ToSqlInsert = Join$(sb, Empty)
End Function

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM