如何在SQL中DECLARE或SET多个值?技术问题咨询
在DECLARE语句中设置多值用于WHERE子句的问题
目标
在DECLARE语句中设置多个值,供WHERE子句的IN条件使用。
问题
无法通过SET语句给变量添加多个值,导致查询无法按预期执行。
尝试实现的代码
DECLARE @Beverage as varchar(1000) SET @Beverage = ('Water', 'Soda', 'Wine', 'Beer') SELECT Beverage FROM ExampleServer WHERE Beverage in (@Beverage)
当前可正常执行的代码
DECLARE @Beverage as varchar(1000) SET @Beverage = ('Water') SELECT Beverage FROM ExampleServer WHERE Beverage in (@Beverage)
解决办法
你这么写行不通的核心原因是:varchar类型的变量只能存储单个字符串,括号里的多个值会被SQL当成一整个字符串处理,IN条件自然没法匹配到多个独立的饮品名称。下面给你两种实用的解决方式:
方式1:用表值变量存多值
表值变量可以直接存储多行数据,完美适配IN条件的需求:
-- 先定义一个表值变量,字段类型和要匹配的Beverage一致 DECLARE @BeverageTable TABLE (Name varchar(100)) -- 把需要的多个值插进去 INSERT INTO @BeverageTable (Name) VALUES ('Water'), ('Soda'), ('Wine'), ('Beer') -- 查询时直接从表值变量里取数 SELECT Beverage FROM ExampleServer WHERE Beverage IN (SELECT Name FROM @BeverageTable)
方式2:用字符串拆分(SQL Server 2016及以上可用)
如果习惯用字符串变量存多值,可以用逗号分隔,再用STRING_SPLIT函数拆成单个值:
DECLARE @Beverage as varchar(1000) SET @Beverage = 'Water,Soda,Wine,Beer' -- 用逗号把多个值分开 SELECT Beverage FROM ExampleServer WHERE Beverage IN (SELECT value FROM STRING_SPLIT(@Beverage, ','))
要是你的SQL Server版本比2016老,那优先用表值变量的方式,兼容性更好;也可以自己写个字符串拆分函数来用,但表值变量的写法更简单直接。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

