SQL Server IN 参数化查询
在 SQL Server 中,直接使用 IN 子句进行参数化查询有一些限制,但可以通过几种方法实现。

(图片来源网络,侵删)
使用动态 SQL 和 sp_executesql
DECLARE @ParamList NVARCHAR(1000);
DECLARE @SQL NVARCHAR(MAX);
SET @ParamList = N'@IDs VARCHAR(MAX)';
SET @SQL = N'SELECT * FROM YourTable WHERE ID IN (' + @IDs + ')';
EXEC sp_executesql @SQL, @ParamList, @IDs = '1,2,3,4,5';
使用字符串分割函数(SQL Server 2025+)
CREATE FUNCTION dbo.SplitString (@String NVARCHAR(MAX), @Delimiter CHAR(1))
RETURNS @Result TABLE (Value INT)
AS
BEGIN
DECLARE @Item NVARCHAR(4000)
WHILE LEN(@String) > 0
BEGIN
SET @Item = LEFT(@String, CHARINDEX(@Delimiter, @String + @Delimiter) - 1)
INSERT INTO @Result (Value) VALUES (CAST(@Item AS INT))
SET @String = RIGHT(@String, LEN(@String) - LEN(@Item) - 1)
END
RETURN
END
-- 使用示例
DECLARE @IDs VARCHAR(MAX) = '1,2,3,4,5';
SELECT * FROM YourTable WHERE ID IN (SELECT Value FROM dbo.SplitString(@IDs, ','));
使用临时表或表变量
-- 创建表变量 DECLARE @IDs TABLE (ID INT); INSERT INTO @IDs VALUES (1), (2), (3), (4), (5); -- 使用JOIN代替IN SELECT yt.* FROM YourTable yt JOIN @IDs i ON yt.ID = i.ID;
使用 XML 参数(SQL Server 2005+)
DECLARE @IDs XML = '<IDs><ID>1</ID><ID>2</ID><ID>3</ID></IDs';
SELECT * FROM YourTable
WHERE ID IN (
SELECT ParamValues.ID.value('.', 'INT')
FROM @IDs.nodes('/IDs/ID') AS ParamValues(ID)
);
使用 OPENJSON(SQL Server 2025+)
DECLARE @IDs NVARCHAR(MAX) = '[1,2,3,4,5]'; SELECT yt.* FROM YourTable yt JOIN OPENJSON(@IDs) AS j ON yt.ID = CAST(j.value AS INT);
最佳实践建议
- 避免动态SQL:除非必要,否则尽量使用其他方法,因为动态SQL有SQL注入风险
- 考虑表变量:对于少量参数,表变量方法最安全且性能较好
- 批量操作:如果可能,考虑先批量插入到临时表,然后使用JOIN
- ORM框架:使用Entity Framework等ORM工具通常会自动处理参数化IN查询
选择哪种方法取决于你的SQL Server版本、具体需求和性能考虑。

(图片来源网络,侵删)
