【发布时间】:2021-10-31 03:27:38
【问题描述】:
目标
我想通过 IN 语句在 Excel 文件中运行 SQL 查询并使用动态参数。
查询
首先,可以是:
SELECT feature1
FROM table
WHERE feature2 IN (?)
or
SELECT feature1
FROM table
WHERE feature2 IN ?
无论参数如何,第二个都有系统误差
语法错误或访问冲突
所以我专注于第一个。
参数
我在指定参数列表时遇到问题(数据 -> 请求和连接 -> 连接 -> 定义 -> 参数):
- 'a','b','c' -> 无返回值
- "a","b","c" -> 无返回值
- "'a','b','c'" -> 无返回值
- 'a' -> 不返回任何内容
- a -> 返回一些东西
- a,b,c -> 无返回值
最后但同样重要的是,当它被硬编码时,这返回Something:
SELECT feature1
FROM table
WHERE feature2 IN ('a', 'b', 'c')
问题
发生了什么?如何动态指定多个参数?有没有办法可视化这个构建的查询来检查有什么问题?或者有什么技术可以避免这个问题?
最好不要使用 VBA
使用 Excel 2019 和 Microsoft SQL Server 2012(否 STRING_SPLIT、OPENJSON)
编辑
根据答案和这个post,我尝试使用这个sql查询来避免使用STRING_SPLIT和OPENJSON:
SELECT feature1
FROM table
WHERE feature2 IN (
SELECT Split.a.value('.', 'NVARCHAR(MAX)') DATA
FROM (
SELECT CAST('<X>'+REPLACE( ? , ',', '</X><X>')+'</X>' AS XML) AS String
) AS A
CROSS APPLY String.nodes('/X') AS Split(a)
);
但是,它无法通过 Excel 理解参数,而在查询中硬编码时它可以工作。
【问题讨论】:
-
你不能传递带有单个 [scalar] 参数的
IN并期望将值视为数组;数组不是 SQL Server 中存在的数据类型。相反,一种方法是使用 Table-Type 参数和JOIN来代替它。否则,您可以使用分隔字符串并拆分值,但由于您使用的是 SQL Server 2012,那么您将无法访问STRING_SPLIT,因此需要使用 good 基于集合的 udf. -
请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。
-
我不明白什么是难以理解的:所有的答案都与我的帖子相关和相关,他们帮助了我。所以我认为我的问题已经很好理解了,但是如果您坚持添加详细信息,我会这样做
标签: sql sql-server excel sql-server-2012