使用整数列表在 WHERE .. IN 条件下创建 SQL 查询
Create SQL query with WHERE .. IN condition using list of integer
我不是 SQL 的专家,我正在努力实现以下目标。
我有一个名为 PersonIds
的整数列表。首先,我需要将这个整数列表转换为字符串列表。为什么?因为据我了解 SQL 中的 WHERE .. IN
条件,这是我需要提供给查询的变量类型。
然后我需要修改字符串列表以防止 SQL 注入,因此在列表的每个 Id
之前插入 @
。
最后我创建了查询并提供了我刚刚创建的列表。
我尝试做的是:
var listIds = string.Join(",@", PersonIds, 0, PersonIds.Count()));
var query = $"DELETE FROM PersonTable WHERE PersonId IN (@{listIds})";
我做错了什么。回顾一下,我需要执行以下步骤:
- 准备我需要提供给查询的列表(包括避免 SQL 注入的机制)
- 使用我创建的列表作为参数创建查询
提前致谢!
也许最简单的方法是添加一些Dapper:
List<int> listIds = ...
connection.Execute("DELETE FROM PersonTable WHERE PersonId IN @listIds",
new { listIds });
Dapper 完成了所有艰苦的工作,弄清楚如何对其进行参数化,同时仍然保持 几乎 接近常规 TSQL。如果您使用的是最新版本的 SQL 服务器,您还可以选择启用 string_split
用法,以最小化参数计数和 query-plan 缓存大小。
请注意,缺少括号是有意而为的 - dapper 对此的处理方式与常规 IN (@foo, @bar)
语法略有不同。
我不是 SQL 的专家,我正在努力实现以下目标。
我有一个名为 PersonIds
的整数列表。首先,我需要将这个整数列表转换为字符串列表。为什么?因为据我了解 SQL 中的 WHERE .. IN
条件,这是我需要提供给查询的变量类型。
然后我需要修改字符串列表以防止 SQL 注入,因此在列表的每个 Id
之前插入 @
。
最后我创建了查询并提供了我刚刚创建的列表。
我尝试做的是:
var listIds = string.Join(",@", PersonIds, 0, PersonIds.Count()));
var query = $"DELETE FROM PersonTable WHERE PersonId IN (@{listIds})";
我做错了什么。回顾一下,我需要执行以下步骤:
- 准备我需要提供给查询的列表(包括避免 SQL 注入的机制)
- 使用我创建的列表作为参数创建查询
提前致谢!
也许最简单的方法是添加一些Dapper:
List<int> listIds = ...
connection.Execute("DELETE FROM PersonTable WHERE PersonId IN @listIds",
new { listIds });
Dapper 完成了所有艰苦的工作,弄清楚如何对其进行参数化,同时仍然保持 几乎 接近常规 TSQL。如果您使用的是最新版本的 SQL 服务器,您还可以选择启用 string_split
用法,以最小化参数计数和 query-plan 缓存大小。
请注意,缺少括号是有意而为的 - dapper 对此的处理方式与常规 IN (@foo, @bar)
语法略有不同。