如何在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
相关产品推荐
相关产品推荐

