27,579
社区成员
发帖
与我相关
我的任务
分享
CREATE FUNCTION dbo.GetMaterialInfo(@MaterialId varchar(50))RETURNS varchar(300)
AS
BEGIN
Declare @Result varchar(300);
Select @Result = '';
Select @Result = @Result+', '+RTRIM(CASE WHEN Manufacturer IS NOT NULL THEN Manufacturer ELSE SubVendor END) + ' ''' + RTRIM(SubPartNumber) + '''' from dbo.MaterialInfo WHERE MaterialId = @MaterialId ORDER BY [Priority] ASC;
Select @Result = CASE WHEN LEN(@Result) > 0 THEN STUFF(@Result,1,1,'') ELSE @Result END;
Return @Result;
END
GO
create function dbo.GetMaterialInfo(@MaterialId varchar(50))
returns varchar(300)
as
begin
declare @r varchar(300);
with t as
(select top(50) case when Manufacturer<>'' then Manufacturer
else SubVendor end 'Manufacturer',
SubPartNumber
from MaterialInfo
where MaterialId=@MaterialId
order by [Priority] ASC)
select @r=isnull(@r+', ','')
+a.Manufacturer+' '
+stuff((select ''' or '''+b.SubPartNumber
from t b
where b.Manufacturer=a.Manufacturer
for xml path('')),1,5,'')
+''''
from t a
group by a.Manufacturer
return @r
end
create table MaterialInfo
(SerialId int,MaterialId varchar(10),SubVendor varchar(10),SubPartNumber varchar(10),
Manufacturer varchar(10),EnabledMRPCal int,[Priority] int)
insert into MaterialInfo
select 1,'TEST01','VR001','PN001','AIX',1,1 union all
select 2,'TEST01','VR001','PN002','AIX',1,2 union all
select 3,'TEST01','VR002','PN100','PHI',1,3 union all
select 4,'TEST02','VW001','PN200','SPLC',1,1 union all
select 5,'TEST02','VW001','PN201','',1,2 union all
select 6,'TEST02','VW001','PN202','',1,3 union all
select 7,'TEST02','VW001','PN301','',1,4
with t as
(
select *,
a.c1 + stuff( ( select ' or ''' + b.SubPartNumber + ''''
from MaterialInfo as b
where a.MaterialId = b.MaterialId
and a.SubVendor = b.SubVendor
and a.Manufacturer = b.Manufacturer
for xml path( '' ) ), 1, 4, '' ) as c2
from (
select distinct
MaterialId
, SubVendor
, Manufacturer
, case when Manufacturer = '' then SubVendor + ' ' else Manufacturer + ' ' end c1
from MaterialInfo
) a
)
select
stuff( ( select ',' + c2 from t where t.MaterialId = MaterialInfo.MaterialId for xml path( '' ) ), 1, 1, '' ) as c3
from MaterialInfo
group by MaterialId
create table MaterialInfo
(SerialId int,MaterialId varchar(10),SubVendor varchar(10),SubPartNumber varchar(10),
Manufacturer varchar(10),EnabledMRPCal int,[Priority] int)
insert into MaterialInfo
select 1,'TEST01','VR001','PN001','AIX',1,1 union all
select 2,'TEST01','VR001','PN002','AIX',1,2 union all
select 3,'TEST01','VR002','PN100','PHI',1,3 union all
select 4,'TEST02','VW001','PN200','SPLC',1,1 union all
select 5,'TEST02','VW001','PN201','',1,2 union all
select 6,'TEST02','VW001','PN202','',1,3 union all
select 7,'TEST02','VW001','PN301','',1,4
-- 建函数
create function dbo.GetMaterialInfo(@MaterialId varchar(50))
returns varchar(300)
as
begin
declare @r varchar(300);
with t as
(select case when Manufacturer<>'' then Manufacturer
else SubVendor end 'Manufacturer',
SubPartNumber
from MaterialInfo
where MaterialId=@MaterialId)
select @r=isnull(@r+', ','')
+a.Manufacturer+' '
+stuff((select ''' or '''+b.SubPartNumber
from t b
where b.Manufacturer=a.Manufacturer
for xml path('')),1,5,'')
+''''
from t a
group by a.Manufacturer
return @r
end
select MaterialId,
dbo.GetMaterialInfo(MaterialId) 'MaterialInfo'
from MaterialInfo
group by MaterialId
/*
MaterialId MaterialInfo
---------- ------------------------------------------------------
TEST01 AIX 'PN001' or 'PN002', PHI 'PN100'
TEST02 SPLC 'PN200', VW001 'PN201' or 'PN202' or 'PN301'
(2 row(s) affected)
*/