如何在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
相关产品推荐
相关产品推荐

