【问题标题】:VBScript Excel ADO connection: Get value using column alias in SQL queryVBScript Excel ADO 连接:在 SQL 查询中使用列别名获取值
【发布时间】:2016-12-06 09:00:57
【问题描述】:

在下面的代码中,我可以使用

从 excel 中获取计数

objTempRecordset.Fields.Item(0).Value

但是,我想在 SQL 中使用列名别名。 即

sSQL = "Select Count(*) AS RecCount FROM [NELimits$] A WHERE A.Type = 'A' AND A.ID = " &Chr(39) & "R001" & Chr(39)

我想使用以下方法获得结果:

objTempRecordset.Fields.Item("RecCount").Value

我也试过objTempRecordset.Fields.Item("_Count(*)_").Value,但没有运气

有人可以告诉我在这种情况下如何使用列名别名吗?

注意:Excel 有 2 列 ID:具有“R001”、“R002”等值 类型:具有诸如“A”、“B”、“C”之类的值

示例代码:

sSQL = "Select Count(*) FROM [NELimits$] A WHERE A.Type = 'A' AND A.ID = " &Chr(39) & "R003" & Chr(39)
Sqlquery = sSQL 
sFilePath = "C:\Temp\DataSheet.xlsx"

Dim objTempConnection : Set objTempConnection = CreateObject("ADODB.Connection")
Dim objTempRecordSet : Set objTempRecordSet = CreateObject("ADODB.Recordset")

Dim strPath
'Define constants for objTempRecordset
Const adOpenStatic=3
Const adLockOptimistic=3
Const adLockPessimistic=2
Const adCmdText = &H001

'Open connection 
objTempConnection.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="& sFilePath &";Extended Properties=""Excel 12.0 Xml;HDR=YES"";"

objTempRecordset.ActiveConnection = objTempConnection
objTempRecordset.CursorType = adOpenStatic
objTempRecordset.LockType = adLockOptimistic 
objTempRecordset.Open Sqlquery 

If objTempRecordset.EOF Or objTempRecordset.BOF Then
    msgbox "no record"
End If

msgbox "Record Count: "&objTempRecordset.RecordCount

msgbox "Value:" & objTempRecordset.Fields.Item(0).Value

【问题讨论】:

  • 刚刚注意到 objTempRecordset.Fields.Item(0).Name 返回 Expr1000objTempRecordset.Fields.Item("Expr1000" ).Value 返回正确的值 但是,我不确定 Expr1000 是什么意思以及它是如何分配的。不确定它是否会因不同的 Excel 工作表、数据等而改变。因此需要一种为列定义别名的方法,以便我可以根据别名检索数据
  • Resolved: ..."SELECT column_name As [alias_name] FROM..." 在 SQL 中解决了这个问题。感谢这篇文章:stackoverflow.com/questions/37466225/…
  • 你确定objTempRecordset.Fields.Item("RecCount").Value 没有像你使用第一个 SQL 查询(而不是代码块内的第二个)那样工作吗?首先,您分配了一个列别名 RecCount,但没有在第二个中被 ACE SQL 引擎分配为通用 Expr1000
  • 至于你的解决方案,你在第一个 SQL 查询中做到了!
  • 没错... objTempRecordset.Fields.Item("RecCount").Value 不起作用,因为我没有使用“Select Count() As [ RowCount ] FROM...” 我只在 SQL 查询中使用了“Select Count() As RowCount FROM...”,即别名应该是为了使用它,在两个方括号之间提到。

标签: sql excel vbscript ado


【解决方案1】:

使用 ACE SQL 引擎(此处用于查询工作簿),原始字段名、列别名或带有空格、特殊字符(非字母数字)或 reserved words 的表名需要包裹在 square 中括号反引号正确地转义它们。

空间

sSQL = "Select Count(*) AS [Rec Count] FROM [NELimits$] A" _
           & " WHERE A.Type = 'A' AND A.ID = 'R003'"
sSQL = "Select Count(*) AS `Rec Count` FROM [NELimits$] A" _
           & " WHERE A.Type = 'A' AND A.ID = 'R003'"

特殊字符(例如,连字符和井号/井号)

sSQL = "Select Count(*) AS [Rec-Count] FROM [NELimits$] A" _
           & " WHERE A.Type = 'A' AND A.ID = 'R003'"
sSQL = "Select Count(*) AS `Rec-Count` FROM [NELimits$] A" _
           & " WHERE A.Type = 'A' AND A.ID = 'R003'"

sSQL = "Select Count(*) AS [Rec#] FROM [NELimits$] A" _
           & " WHERE A.Type = 'A' AND A.ID = 'R003'"
sSQL = "Select Count(*) AS `Rec#` FROM [NELimits$] A" _
           & " WHERE A.Type = 'A' AND A.ID = 'R003'"

保留字(例如,Count)

sSQL = "Select Count(*) AS [Count] FROM [NELimits$] A" _
           & "  WHERE A.Type = 'A' AND A.ID = 'R003'"
sSQL = "Select Count(*) AS `Count` FROM [NELimits$] A" _
           & " WHERE A.Type = 'A' AND A.ID = 'R003'"

否则,任何字段名或列别名在查询中都是合法的,可以在以下格式的记录集中读取:

objTempRecordset.Fields.Item(0).Value               ' BY INDEX IN ITEM '
objTempRecordset.Fields.Item("Rec Count").Value     ' BY NAME IN ITEM '
objTempRecordset.Fields("Rec Count").Value          ' BY NAME IN FIELD COLLECTION '
objTempRecordset![Rec Count].Value                  ' BY NAME (EXCLAMATION POINT QUALIFIER) '

此外,缺少的列别名使用 ACE 以特殊方式处理:

查询表达式中缺少别名(例如,计数函数聚合)

sSQL = "Select Count(*) FROM [NELimits$] A" _ 
           & " WHERE A.Type = 'A' AND A.ID = 'R003'"

重复字段中缺少别名

sSQL = "Select ID, ID FROM [NELimits$] A" _
           & " WHERE A.Type = 'A' AND A.ID = 'R003'"

对于以上两个缺失的别名,ACE 引擎创建一个列别名,通常从 Expr1(在 MS Access 内部 - ACE 引擎的常用接口)或 Expr1000 开始所有其他未命名的表达式或未命名的重复字段引用的 ODBC 连接和递增。

【讨论】:

  • 太棒了!非常感谢@Parfait的详细回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
相关资源
最近更新 更多