记录SQL Server存储过程中,带in条件的参数。查询不到数据的问题

文章讲述了在SQLServer存储过程中,遇到带IN参数的查询语句无法查询数据的问题,通过使用表值函数f_split将参数字符串拆分,成功解决了查询不到数据的问题。
摘要由CSDN通过智能技术生成

在工作中遇到一个关于sql server存储过程的问题。在存储过程发现带in的查询语句,传入参数后无法查到数据。问题如下:

select FMaterialGroup,g.FNUMBER from T_BD_MATERIAL t3 
inner join (select FNUMBER, FID,case when FPARENTID=0  then FID else FPARENTID end  FPARENTID from T_BD_MATERIALGROUP) g
on g.FID=t3.FMaterialGroup where g.FNUMBER in ('01.01','01') --直接放入固定参数可以查询出数据

select FMaterialGroup,g.FNUMBER from T_BD_MATERIAL t3 
inner join (select FNUMBER, FID,case when FPARENTID=0  then FID else FPARENTID end  FPARENTID from T_BD_MATERIALGROUP) g
on g.FID=t3.FMaterialGroup where g.FNUMBER in (select FNUMBER from T_BD_MATERIALGROUP)  --在in的查询条件中直接使用sql语句查询,也可以查询出数据

那么问题来了。

declare @putItem varchar(max);

select top 1 @putItem= STUFF((SELECT ',' + FNUMBER  FROM T_BD_MATERIALGROUP   FOR XML PATH('')) , 1 , 1 , '') 
from T_BD_MATERIALGROUP   --列转行,并且用逗号分开

select  @putItem

select FMaterialGroup,g.FNUMBER from T_BD_MATERIAL t3 
inner join (select FNUMBER, FID,case when FPARENTID=0  then FID else FPARENTID end  FPARENTID from T_BD_MATERIALGROUP) g
on g.FID=t3.FMaterialGroup where g.FNUMBER in (@putItem) --使用参数进行查询的话,查询不到数据。

--@putItem参数的值='01,02,01.01'。

--也尝试把@putItem参数的值改造为:'01','02','03','04';

--结果还是查询不到数据。

然后就在网上查找资料,找到了解决办法,特此记录一下。

需要使用到表值函数。表值函数是返回表类型数据的用户自定义函数。表值函数的返回类型是表,因此,可以像使用表一样使用表值函数。表值函数具体创建的方法我就不在此赘述了。贴上需要用到的表值函数

create  function  [dbo].[f_split](@c varchar(2000),@split varchar(2))   
returns  @t table(col   varchar(20))   
as   
begin     
while(charindex(@split,@c)<>0)   
begin   
insert  @t(col)   values   (substring(@c,1,charindex(@split,@c)-1))   
set @c=stuff(@c,1,charindex(@split,@c),'')   
end   
insert @t(col)values(@c)   
return   
end

然后就是在语句中进行调用

select FMaterialGroup,g.FNUMBER from T_BD_MATERIAL t3 
inner join (select FNUMBER, FID,case when FPARENTID=0  then FID else FPARENTID end  FPARENTID from T_BD_MATERIALGROUP) g
on g.FID=t3.FMaterialGroup where g.FNUMBER in (select col from [dbo].[f_split](@putItem,','))  -- col 这个字段,就是表值函数中定义的字段

至此,在存储过程中带in的参数。查询不到数据的问题就解决了。

在上述的问题中,我们首先创建了一个 f_split分割函数,其输入参数为字符串和分隔符。函数将字符串拆分为行,并以表格形式返回结果。

然后,我们声明了一个变量 @c表示输入的以逗号分隔的字符串,以及一个变量 @split表示分隔符。在查询中,我们使用 f_split函数将字符串转换为数据集,然后将其与表中的 ColumnName 列进行比较,以实现 IN 查询的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值