You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写接受整数数组参数并可在IN子句中使用该数组的存储过程

核心结论

这种实现方式完全可行,目前主流关系型数据库(SQL Server、PostgreSQL、MySQL 8.0+等)都原生支持数组/表值类型参数,不需要手动解析逗号分隔字符串。

不同数据库的实现示例

SQL Server 环境实现

SQL Server 采用表值参数(TVP)实现,步骤如下:

  • 第一步:先创建自定义表类型,用于存储整数数组
CREATE TYPE IntArray AS TABLE (Value INT NOT NULL);
  • 第二步:编写接收该类型参数的存储过程,直接在IN子句中使用
CREATE PROCEDURE GetUserByIds
    @UserIds IntArray READONLY
AS
BEGIN
    SELECT * FROM Users 
    WHERE UserId IN (SELECT Value FROM @UserIds)
    -- 也可以用JOIN写法,大数据量下性能更优:
    -- SELECT u.* FROM Users u INNER JOIN @UserIds ids ON u.UserId = ids.Value
END
  • 调用方式示例:
DECLARE @Ids IntArray
INSERT INTO @Ids VALUES (1),(3),(5),(7)
EXEC GetUserByIds @UserIds = @Ids

PostgreSQL 环境实现

PostgreSQL 原生支持INT数组类型,实现更简单:

  • 存储过程编写:
CREATE OR REPLACE FUNCTION get_user_by_ids(user_ids INT[])
RETURNS SETOF Users AS $$
BEGIN
    RETURN QUERY SELECT * FROM Users WHERE UserId = ANY(user_ids);
END;
$$ LANGUAGE plpgsql;
  • 调用方式示例:
SELECT * FROM get_user_by_ids(ARRAY[1,3,5,7]);

MySQL 8.0+ 环境实现

MySQL 可以用JSON数组参数配合JSON_TABLE原生解析,不需要自定义拆分逻辑:

  • 存储过程编写:
DELIMITER //
CREATE PROCEDURE GetUserByIds(IN user_ids JSON)
BEGIN
    SELECT u.* FROM Users u
    INNER JOIN JSON_TABLE(user_ids, '$[*]' COLUMNS(id INT PATH '$')) AS ids
    ON u.UserId = ids.id;
END //
DELIMITER ;
  • 调用方式示例:
CALL GetUserByIds('[1,3,5,7]');
对比传统逗号分隔字符串方案的优势
  • 完全避免SQL注入风险:参数化传值不需要拼接字符串,没有注入漏洞
  • 性能更优:不需要自定义字符串拆分逻辑,数据库原生类型的查询效率远高于手动解析
  • 代码可维护性更高:不需要处理字符串拆分的边界情况(比如空值、非法字符、首尾多余逗号等)

内容的提问来源于stack exchange,提问作者Jonathan Wood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:15:04