SQL VBA 查询不拾取字母字符,仅拾取全数字字段

问题描述 投票:0回答:1

我正在运行一个子程序,它基本上从一张表中获取数据,在其上运行 SQL 查询并将结果存入另一张表中。我注意到,虽然它“正确”运行,但应该包含字母的字段最终并未显示出来(粘贴为空白)。我有什么遗漏的吗?代码如下:

Sub sql_group()

Dim connection As New ADODB.connection
Dim rs As New ADODB.Recordset, arr As Variant, rs1 As New ADODB.Recordset
Dim sh As Worksheet, SQLQuery As String
Set sh = ThisWorkbook.Worksheets("Sheet1")


'Create second query string, join with another query and then pull amount from query and everything else from sheet
connection.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Workbooks(1).FullName & _
";Extended Properties=""Excel 12.0;HDR=YES;"";"

SQLQuery = "Select * from [TEMP$]  "
rs.Open SQLQuery, connection


With sh

.Cells.ClearContents
For i = 0 To rs.Fields.Count - 1
.Cells(1, i + 1).Value = rs.Fields(i).Name
Next i
.Range("A2").CopyFromRecordset rs

End With
rs.Close
connection.Close
Set rs = Nothing
Set connection = Nothing


End Sub

我尝试了不同的提供程序类型,更改了数据源/数据转储位置的字段,将所需字段的数据类型更改为常规,但没有看到任何成功。

sql vba
1个回答
0
投票

问题是 ADODB 期望有具有字段类型的列。在常规数据库中,每一列都有一个类型(字符串、数字、日期...),因此不会有问题。

在 Excel 中,没有每列类型之类的东西,您可以将每种类型的数据放入每种类型的单元格中。因此,驱动程序尝试通过分析前 n 行的内容来猜测字段类型(始终无法计算出 n 的值)。如果主要有数字,则该列被视为数字列,如果主要有字符串,则该列被视为字符串。

现在,在您的数据中,您的至少一列中似乎有混合值(数字和字符串)。如果驱动程序猜测该列是数字,并且您发出命中字符串数据的 SQL 命令,则内容将被设置为 null,因为它无法转换为数字。这就是您在结果中看不到这些值的原因。

通常,如果你在一列中混合数据类型,这是一个设计缺陷,但当然我无法判断你的特殊情况。如果您的数据需要这样,最好的办法是将整个列格式化为“文本” - 在这种情况下,驱动程序会将所有内容视为字符串并复制所有数据。缺点:复制的数据实际上是一个字符串,不再是数字,即使它看起来像一个数字。

看看下面的例子:

  • 第一列(“Numval 1”)主要包含第一行中的数字
  • 第二列(“Numval 2”)主要包含第一行中的字符串
  • 第三列(“Numval 3”)包含与第一列相同的数据,但格式为文本。

enter image description here

现在让你的代码针对它运行,结果表包含:

  • 第一列中只有数字。文本保持空白。
  • 第二列中包含所有数据,但为文本形式。驱动程序猜测该列包含文本,因为第一行填充了文本。
  • 第三列是所有数据,但为文本。驱动程序猜测该列包含文本,因为数据格式为文本。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.