MSSQL 将多个id传给存储过程实现 where id in (@ids)

业务场景

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,','))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值