在工作中遇到一个关于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 查询的功能。
文章讲述了在SQLServer存储过程中,遇到带IN参数的查询语句无法查询数据的问题,通过使用表值函数f_split将参数字符串拆分,成功解决了查询不到数据的问题。

4676

被折叠的 条评论
为什么被折叠?



