之前客户有个需求:做一个bom查询报表,过滤条件:父项物料代码。要求可以进行多个父项物料代码进行查看

解决思路:把存储过程的变量进行拆分,创建一个临时表放置拆分的数据,然后取数据。

代码如下:

alter PROCEDURE bobang_bomselect
@ID nvarchar(500) 
AS
BEGIN    
SET NOCOUNT ON
if @ID='' or @ID is null
begin
set @ID='%'
end 
DECLARE @PointerPrev int
DECLARE @PointerCurr int
DECLARE @TId nvarchar(500) 
SET @PointerPrev = 1
CREATE TABLE #t_info
(
FBillNo nvarchar(50) 
)
WHILE(@PointerPrev <LEN(@ID))
BEGIN
SET @PointerCurr=CharIndex(',',@ID,@PointerPrev)
IF(@PointerCurr>0)
BEGIN
SET @TId = cast(SUBSTRING(@ID,@PointerPrev,@PointerCurr - @PointerPrev)as nvarchar)
insert into #t_info(FBillNo) values(@TId)
SET @PointerPrev = @PointerCurr+1
END
ELSE
BREAK
END
--因为最后一个ID后面没有逗号,所以在跳出循环后获取
SET @TId = cast(substring(@ID,@PointerPrev,LEN(@ID)-@PointerPrev+1) as nvarchar)
insert into #t_info(FBillNo) values(@TId)


select C.FNumber AS 父项物料代码,C.FName AS 父项物料名称,C.FModel AS 父项规格型号,A.FCheckDate AS 建立日期,
B.FEntryID AS 顺序号,D.FNumber AS 子项物料代码,D.FName AS 子项物料名称,d.FModel AS 子项规格型号,
case when d.FErpClsID=1 then '外购' when d.FErpClsID=2 then '自制' else '委外加工' end as 物料属性,
f.FName as 常用单位,b.FQty as 常用用量,case when d.FUseState =341 then '使用' end as 使用状态, 
case when d.FDeleted=0 then '' else N''end as 是否禁用 
from ICBOM A
LEFT JOIN ICBOMChild B ON A.FInterID=B.FInterID
LEFT JOIN t_ICItem C ON A.FItemID=C.FItemID
LEFT JOIN t_ICItem D ON B.FItemID=D.FItemID
LEFT JOIN t_Item f ON B.FUnitID=f.FItemID
where c.FNumber in (SELECT fbillno FROM #t_info) AND A.FUseStatus=1072 or (c.FNumber like @ID and A.FUseStatus=1072)
ORDER BY C.FNumber,FEntryID

DROP TABLE #t_info
SET NOCOUNT OFF    
END
GO

--EXEC bobang_bomselect '2.0002,BG.09.0012-001'

 

 

--期间百度了好几种方式,存留以备后用(开始时错误的把可以过滤的值全部取出来形成一个数组,然后结果就是取全部的数据了)

--把数值取出来用“,”隔开,形成一个数组
declare @s varchar(1000)
set @s=''
SET @s=STUFF((
SELECT ','+cast(C.FNumber as varchar) from ICBOM A
LEFT JOIN t_ICItem C ON A.FItemID=C.FItemID FOR XML PATH('')
),1,1,'')
SELECT @s

--第二种
declare @su varchar(100)
declare @count int
declare @i int --记录条数
set @count = (select count(*) from ICBOM A
LEFT JOIN t_ICItem C ON A.FItemID=C.FItemID)
set @i = 1;
while @i <= @count
begin
select @su=FNumber
from
(select C.FNumber,row_number() over(order by @@servername) as rownum
from ICBOM A
LEFT JOIN t_ICItem C ON A.FItemID=C.FItemID
)B where rownum = @i
set @i = @i + 1
print @su
end

--结果
declare @b varchar(8000)
declare @a varchar(8000)
SET @a=STUFF((
SELECT ','+cast(C.FNumber as varchar) from ICBOM A
LEFT JOIN t_ICItem C ON A.FItemID=C.FItemID FOR XML PATH('')
),1,1,'')
set @b='select C.FNumber AS 父项物料代码,C.FName AS 父项物料名称,C.FModel AS 父项规格型号,A.FCheckDate AS 建立日期,
B.FEntryID AS 顺序号,D.FNumber AS 子项物料代码,D.FName AS 子项物料名称,d.FModel AS 子项规格型号 from ICBOM A
LEFT JOIN ICBOMChild B ON A.FInterID=B.FInterID
LEFT JOIN t_ICItem C ON A.FItemID=C.FItemID
LEFT JOIN t_ICItem D ON B.FItemID=D.FItemID
LEFT JOIN t_Item f ON B.FUnitID=f.FItemID
where C.FNumber in ('''+replace(@a,',',''',''')+''')'
exec (@b)

备注: ('''+replace(@a,',',''',''')+''')'  这边是把数组里的逗号转义为:',' 结果就是:' xxx','xxx','····  '