业务场景
sql server 开发中有时我们需要将多个id做为一个参数传给存储过程,然后期望存储过程中能像这样进行多个id的查询 where id in (1,2,3)
,而事实上id=1,2,3是通过一个字符串变量传递进来的@ids='1,2,3'
,这样是不支持直接将@ids
放到in后面的。
解决方案
用动态sql是一种方式,这里提供另一种方式,自定义用户函数将字符串的多个id拆分到一个表中。
1. 创建函数
-- =============================================
-- 名称:字符串分隔成表
-- 维护:ifu25
-- 日期:2018/08/14
-- 说明:用于将类似'1,2,3,4,5,6'的字符串分解成多行,以便于在存储过程中使用 where id in(select * from StrSplitToTable(@Strs,',') )
-- =============================================
create function [dbo].[StrSplitToTable]
(
@Strs varchar(max), --需要被分隔的字符串
@Split varchar(50) --分隔符
)
returns @Temp table (id varchar(50) null)
as
begin
while (charindex(@Split, @Strs)<>0)
begin
insert @Temp(id) values (substring(@Strs, 1, charindex(@Split, @Strs)-1))
set @Strs=stuff(@Strs, 1, charindex(@Split, @Strs), '')
end
insert @Temp(id) values (@Strs)
return
end
2. 使用示例
declare @xx varchar(50)
set @xx='1,2,3'
select * from biz_bill where id in(select * from [dbo].[StrSplitToTable] (@xx,','))