You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Excel VBA中执行Amazon Redshift大小写敏感配置并运行查询?

问题分析与解决方案

你的问题核心是:VBA中通过Excel内置ODBC连接执行包含SET enable_case_sensitive_identifier TO true和SELECT的复合SQL时,SET可能执行了,但SELECT语句未生效。原因通常是Excel内置ODBC连接默认不支持多语句批量执行,或者会话上下文在刷新时被重置了。

以下是几种可行的解决方法:

方法1:用ADODB手动分步骤执行(最可靠)

放弃Excel内置的连接刷新,改用ADODB对象直接控制数据库会话,先执行SET语句,再执行查询并将结果写入工作表。示例代码如下:

Sub Find_Data_Using_ADODB()
    Dim conn As Object
    Dim rs As Object
    Dim sqlSet As String, sqlSelect As String
    Dim ws As Worksheet
    Dim i As Integer
    
    ' 初始化工作表
    Set ws = ThisWorkbook.Sheets("Data")
    ws.Cells.Clear
    
    ' 定义SQL语句
    sqlSet = "SET enable_case_sensitive_identifier TO true;"
    sqlSelect = "SELECT " & _
                "empl_name AS ""Employee Name"", " & _
                "empl_city AS ""Employee City"", " & _
                "EmpId " & _
                "FROM Redshift.EmployeeTable"
    
    ' 创建并打开ADODB连接(复用现有连接的字符串)
    Set conn = CreateObject("ADODB.Connection")
    conn.ConnectionString = ThisWorkbook.Connections("redshiftdb").ODBCConnection.ConnectionString
    conn.Open
    
    ' 执行SET语句
    conn.Execute sqlSet
    
    ' 执行查询并获取结果集
    Set rs = conn.Execute(sqlSelect)
    
    ' 将字段名写入表头
    For i = 0 To rs.Fields.Count - 1
        ws.Cells(1, i + 1).Value = rs.Fields(i).Name
    Next i
    
    ' 将数据写入工作表
    ws.Cells(2, 1).CopyFromRecordset rs
    
    ' 清理对象
    rs.Close
    conn.Close
    Set rs = Nothing
    Set conn = Nothing
End Sub

方法2:开启ODBC驱动的多语句支持

如果坚持用Excel内置连接,可尝试配置Redshift ODBC驱动允许多语句执行:

  • 打开Windows的「ODBC数据源管理器」(注意选择32/64位对应你的Excel版本)
  • 找到你的Redshift数据源,点击「配置」
  • 在驱动设置中查找Allow multiple statements或类似选项(不同版本驱动名称可能有差异),勾选该选项
  • 保存配置后重新运行你的VBA代码

方法3:在连接字符串中直接设置会话参数

部分Redshift ODBC驱动支持在连接字符串中直接指定会话参数,你可以修改连接的ConnectionString,添加如下参数:

;Options=EnableCaseSensitiveIdentifier=1

修改后的VBA代码片段:

With ActiveWorkbook.Connections("redshiftdb").ODBCConnection
    .ConnectionString = .ConnectionString & ";Options=EnableCaseSensitiveIdentifier=1"
    .CommandText = "SELECT empl_name AS ""Employee Name"", empl_city AS ""Employee City"", EmpId FROM Redshift.EmployeeTable"
End With
ActiveWorkbook.RefreshAll

注意:不同驱动版本的参数格式可能不同,若此参数无效可查阅Redshift ODBC驱动官方文档确认正确参数名。


内容的提问来源于stack exchange,提问作者fdkgfosfskjdlsjdlkfsf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 12:25:05