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

如何在TSQL中向WHERE子句传入逗号分隔的字符串?

解决TSQL中IN子句使用字符串参数的错误

错误原因

你当前的代码中,@Slots是一个包含逗号分隔值的字符串,SQL Server会将整个'1,2'作为单个值尝试转换为int类型,这不符合整数格式,因此抛出转换失败的错误。

正确实现方式

方法1:使用STRING_SPLIT(SQL Server 2016及以上版本)

这是最简便的方案,利用内置的STRING_SPLIT函数将逗号分隔的字符串拆分为单独的行,再传入IN子句:

declare @Slots varchar(50)
set @Slots = '1,2'
select * from Schedules where SlotID in (SELECT value FROM STRING_SPLIT(@Slots, ','))

方法2:自定义字符串拆分函数(适用于SQL Server 2016以下版本)

如果你的SQL Server版本不支持STRING_SPLIT,可以先创建一个自定义拆分函数:

CREATE FUNCTION dbo.SplitString
(
    @InputString NVARCHAR(MAX),
    @Delimiter NVARCHAR(50)
)
RETURNS @OutputTable TABLE (Value NVARCHAR(MAX))
AS
BEGIN
    DECLARE @StartIndex INT, @EndIndex INT

    SET @StartIndex = 1
    IF SUBSTRING(@InputString, LEN(@InputString) - 1, LEN(@InputString)) <> @Delimiter
    BEGIN
        SET @InputString = @InputString + @Delimiter
    END

    WHILE CHARINDEX(@Delimiter, @InputString) > 0
    BEGIN
        SET @EndIndex = CHARINDEX(@Delimiter, @InputString)
        INSERT INTO @OutputTable(Value)
        SELECT SUBSTRING(@InputString, @StartIndex, @EndIndex - @StartIndex)
        SET @InputString = SUBSTRING(@InputString, @EndIndex + 1, LEN(@InputString))
    END

    RETURN
END

然后使用该函数查询:

declare @Slots varchar(50)
set @Slots = '1,2'
select * from Schedules where SlotID in (SELECT Value FROM dbo.SplitString(@Slots, ','))

方法3:动态SQL(注意SQL注入风险)

通过拼接SQL语句的方式实现,但仅当@Slots为可信输入时使用,避免SQL注入:

declare @Slots varchar(50)
declare @Sql nvarchar(max)
set @Slots = '1,2'
set @Sql = N'select * from Schedules where SlotID in (' + @Slots + N')'
EXEC sp_executesql @Sql

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:50:45