sql - 使用单元格值范围内的条件运行 SQL 查询列表
问题描述
我正在尝试运行 SQL 查询列表,其中存在“代码”条件并且值位于另一张工作表上的一系列单元格中(从单元格 A2 到 A385)。
我有下面的代码,但是,我得到一个无效的 SQLQueries 对象名称!$A2:A385
所以,我知道语法不正确,但无论阅读大量文章,我都在努力寻找正确的语法。
Sub RunSQLQueries()
'Select SQLQueries sheet
Sheets("SQLQueries").Activate
'Initializes variables
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim ConnectionString As String
Dim StrQuery As String
'Setup the connection string for accessing MS SQL database
ConnectionString = "Provider=SQLOLEDB; Data Source=HOSTNAME; Initial Catalog=DBNAME; UID=domain\user; Integrated Security=SSPI"
'Opens connection to the database
cnn.Open ConnectionString
'Timeout
cnn.CommandTimeout = 900
'Build SQK queries
StrQuery = "SELECT * FROM table WHERE code IN (SELECT * FROM [SQLQueries!$A2:A385])"
'Performs the queries
rst.Open StrQuery, cnn
'Select Results sheet
Sheets("Results").Activate
'Dumps all the results from the StrQuery into cell A2 of the active sheet
Range("A2").CopyFromRecordset rst
End Sub
我期望的结果是使用值范围中的每个条件运行 SQL 查询,结果从单元格 A2 向下填充到“结果”表中
解决方案
查询字符串按字面意思发送到数据库服务器,并且由于您的 sql 尝试引用服务器无法访问的 excel 列表,因此会返回错误。服务器正在寻找一个名为 [SQLQueries!$A2:A385] 的表
要坚持您当前的计划,您需要按字面意思传递 IN () 子句或通过格式如下的 vba 变量传递:IN ('item1', 'item2' ...)
注意:如果项目是数字,您可以删除单引号
我建议通过以下方式重新考虑计划 1) 如果可以在数据库端进行调整:您可以创建一个新的引用表来连接到实际表还是创建一个只返回所需行的视图?然后,您需要在运行查询之前调整过滤视图/表的工作。这个想法是你不需要每次调整查询 bc 一个常量 sql 字符串将返回你需要的行或者 2)如果源表有 100k 行或更少,并且数据不是太宽,只需选择所有行进入新工作表中的 excel,然后过滤该工作表(在 excel 中添加一个新列,使用 vlookup 针对您的参考表返回 true)或在参考表上使用 vlookup 来拉取所需的列
推荐阅读
- wxpython - 改变对 wx.panel 的关注
- mongodb - MongoDB查询文档具有一个字段的最新值并保留其他字段
- python - aiohttp:授权被拒绝,错误:未登录
- c# - 禁用触发器在表中插入记录可能会导致延迟,如何管理?
- docker - 管理 docker 镜像版本
- list - 在flutter中搜索并找到DTO类列表中的字符串?
- java - Map<> 中的 Map<> 作为值 -> 如何从 Map<> 创建对象,其中值是另一个 Map<>?
- amazon-s3 - Logstash 从 s3 读取所有 ELB 日志,而不仅仅是当前日志
- mysql - 错误 1452:无法添加或更新子行:外键约束失败,任何人都可以提供帮助
- mongodb - '在副本集配置中找到名为'majority'的写入关注模式'错误