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

如何在SQL的IN语句中使用存储smallint集合的变量?

解决SQL中IN语句使用多值变量的问题

嗨,我来帮你搞定这个困扰~SQL里确实没有像编程语言那样的“数组”类型,但我们有好几种替代方案,完美适配你的smallint列需求,再也不会报语法或类型转换错误啦:

1. 用表变量(最推荐,类型完全匹配)

表变量就像一个临时的迷你表,专门用来存你需要的那些数值,和你的目标列类型完全一致,不会有转换问题:

-- 定义表变量,指定存储smallint类型的数值
DECLARE @var TABLE (number smallint)
-- 把需要的数值批量插入进去
INSERT INTO @var VALUES (2), (3), (49), (53), (34)
-- 查询时直接从表变量里取数值就行
SELECT something FROM somewhere WHERE number IN (SELECT number FROM @var)

这个方法的好处是可以重复使用@var里的数据,而且类型严格匹配,不会出任何转换错误。

2. 用临时表(适合数据量较大的场景)

如果你的数值列表很长,临时表也是个不错的选择,它存在tempdb里,性能表现更稳定:

-- 创建临时表
CREATE TABLE #var (number smallint)
-- 插入数值
INSERT INTO #var VALUES (2), (3), (49), (53), (34)
-- 执行查询
SELECT something FROM somewhere WHERE number IN (SELECT number FROM #var)
-- 用完可以手动删除(不删也没关系,会话结束会自动清理)
DROP TABLE #var

3. 字符串变量+拆分函数(适合需要传递字符串参数的场景)

如果你之前尝试用varchar变量,其实可以通过字符串拆分来实现,但一定要记得把拆分后的结果转换成smallint类型:

-- 定义字符串变量,用逗号分隔数值
DECLARE @var varchar(50) = '2,3,49,53,34'
-- 拆分字符串并转换为smallint,再用IN子句匹配
SELECT something FROM somewhere 
WHERE number IN (SELECT CAST(value AS smallint) FROM STRING_SPLIT(@var, ','))

⚠️ 注意:这个方法要求你的SQL Server版本是2016及以上(STRING_SPLIT是2016新增的函数),而且字符串里的每个值都必须是有效的smallint,不然会报转换错误。

4. 直接用表值构造函数(一次性使用的场景)

如果你不需要重复使用这个数值列表,也可以直接把数值写在IN子句里,用表值构造函数:

SELECT something FROM somewhere 
WHERE number IN (VALUES (2), (3), (49), (53), (34)) AS nums(num)

这种方式不用定义变量,简单直接,适合只执行一次的查询。

内容的提问来源于stack exchange,提问作者Syntax Error

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:38:06