存储过程接收多个值(用分隔符号的字符串参数)的用in查询

时间:2023-01-07 16:57:56

--这个是截取字符串的函数,在生成存储过程的时候调用了
go
create function [dbo].[f_split](@SourceSql varchar(max),@StrSeprate varchar(10))
    returns @temp table(Rowvalue varchar(1000))
as
    begin
        declare @i int
        set @SourceSql=rtrim(ltrim(@SourceSql))
        set @i=charindex(@StrSeprate,@SourceSql)
        while @i>=1
        begin
            insert @temp values(left(@SourceSql,@i-1))
            set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
            set @i=charindex(@StrSeprate,@SourceSql)
        end
        if @SourceSql<>''
        insert @temp values(@SourceSql)
     return
    end
  go

 

 

调用例子:

--创建查询的存储过程,参数为Product_ID

create procedure sel_table(@Sel_ProductID varchar(1000))
as
begin
 select  distinct Product.Name as '产品名称',
       InsureCompany.Name as '寿险公司',
       dbo.fun_SalesChannel(Product.ID) as '销售渠道',
       ProductType.Name as '产品类型',
       dbo.fun_ExtraInsureProductType(Product.ID) as '附加险产品类型',
       dbo.fun_PrimarySecondaryInsure(Product.PrimarySecondaryInsureID) as '主附险/计划',
       dbo.fun_CustomerRequirement(Product.ID) as '客户需求',
       dbo.fun_TargetCustomer(Product.ID) as '目标客户',
       isnull(CONVERT(varchar(50),InsureAge.insureFrom),'')+
          InsureAge.insurefromUnit+isnull(CONVERT(varchar(50),InsureAge.insureTo),'')+
          InsureAge.InsureToUnit as '投保年龄',
       dbo.fun_Duration_01(Product.ID) as '保险期间',
       dbo.fun_PaymentFrequency(Product.ID) as '交费频率',
       dbo.fun_Duration_02(Product.ID) as '交费期间',
       dbo.fun_MarketType(Product.ID) as '市场细分',
       (case ProductRole.checkedNew
            when '1' then '新产品'+convert(varchar(50),ProductRole.newDate,20)
            when '0' then '' end) +
       (case ProductRole.CheckedTop3
         when '1' then '销售前三名' +CONVERT(varchar(50),ProductRole.Top3StartDate,20)+ '至'+
         isnull((CONVERT(varchar(50),ProductRole.Top3EndDate,20)),'')
         when '0' then ''  end) as '产品角色',
        isnull(CONVERT(varchar(50),Product.SalesStartDate,20),'')+
           '至' +isnull(CONVERT(varchar(50),Product.SalesEndDate,20),'')  as '销售时间',
       ProductOtherInfo.SellingPoint as'销售卖点',
       ProductOtherInfo.PrimaryInsureResponsibility as '主要保险责任',
       ProductOtherInfo.OtherCharacteristic as '其它特点',
       ProductOtherInfo.CheckInvestInsureRule as '核保/投保规则',
       ProductOtherInfo.Fee as '费用',
       ProductOtherInfo.SalesSituation as '销售情况',
       ProductOtherInfo.Advantage as '优点',
       ProductOtherInfo.Shortcoming as '缺点',
       ProductOtherInfo.Memo as '备注',
       ProductOtherInfo.AttachMent as'附件'
from Product,
     InsureCompany,
     ProductType,
     PrimarySecondaryInsure,
     InsureAge,
     ProductRole,
     ProductOtherInfo
where --charindex( ', '   + CONVERT(varchar(100), Product.ID)   +   ', ', ', '   +  @Sel_ProductID    +   ', ')   >   0 and
   Product.InsureCompanyID=InsureCompany.ID and
      Product.ProductTypeID=ProductType.ID and
      Product.InsureAgeID=InsureAge.ID and
      Product.ProductRoleID=ProductRole.ID and
      Product.ProductOtherInfoID=ProductOtherInfo.ID
      --and Product.ID in ('B9789F3B-8A26-4803-9676-0C19C911452A','52D35A3F-5B85-40ED-BA1E-B96770CEC6FE')
      and Product.ID in(select Rowvalue from dbo.f_split(@Sel_ProductID, ','))    
end
Go

--删除存储过程
drop procedure sel_table

select * from Product where Product.ID in ('B9789F3B-8A26-4803-9676-0C19C911452A','52D35A3F-5B85-40ED-BA1E-B96770CEC6FE')

--执行存储过程
exec sel_table 'B9789F3B-8A26-4803-9676-0C19C911452A,52D35A3F-5B85-40ED-BA1E-B96770CEC6FE'

 

--页面上使用到的函数

--创建函数,读取多选项

--销售渠道函数
create function [dbo].[fun_SalesChannel](@id uniqueidentifier) returns nvarchar(1000)
as
begin
declare @str nvarchar(1000)
set @str = ''
select @str = SalesChannel.Name + ',' + @str 
from Product,SalesChannel,SalesChannelValue
where Product.ID=SalesChannelValue.ProductID and
      SalesChannel.ID=SalesChannelValue.SalesChannelID and
      Product.ID = @id and
      SalesChannelValue.Checked=1
return @str
end
go

--附加险产品类型函数
create function [dbo].[fun_ExtraInsureProductType](@id uniqueidentifier) returns nvarchar(1000)
as
begin
declare @str nvarchar(1000)
set @str = ''
select @str = ExtraInsureProductType.Name+ ',' + @str
from Product,ExtraInsureProductType,ExtraInsureProductTypeValue
where Product.ID=ExtraInsureProductTypeValue.ProductID and
      ExtraInsureProductType.ID=ExtraInsureProductTypeValue.ExtraInsureProductTypeID and
      Product.ID = @id and
      ExtraInsureProductTypeValue.Checked=1
return @str
end
go

--客户需求
create function [dbo].[fun_CustomerRequirement](@id uniqueidentifier) returns nvarchar(1000)
as
begin
declare @str nvarchar(1000)
set @str = ''
select @str = CustomerRequirement.Name+ ',' +@str
from Product,CustomerRequirement,CustomerRequirementValue
where Product.ID=CustomerRequirementValue.ProductID and
      CustomerRequirement.ID=CustomerRequirementValue.CustomerRequirementID and
      Product.ID = @id and
      CustomerRequirementValue.Checked=1
return @str
end
go

--目标客户函数
create function [dbo].[fun_TargetCustomer](@id uniqueidentifier) returns nvarchar(1000)
as
begin
declare @str nvarchar(1000)
set @str = ''
select @str = TargetCustomer.Name+ ',' + @str
from Product,TargetCustomer,TargetCustomerValue
where Product.ID=TargetCustomerValue.ProductID and
      TargetCustomer.ID=TargetCustomerValue.TargetCustomerID and
      Product.ID = @id and
      TargetCustomerValue.Checked=1
return @str
end
go

--交费频率
create function [dbo].[fun_PaymentFrequency](@id uniqueidentifier) returns nvarchar(1000)
as
begin
declare @str nvarchar(1000)
set @str = ''
select @str = PaymentFrequency.Name + ',' + @str 
from Product,PaymentFrequency,PaymentFrequencyValue
where Product.ID=PaymentFrequencyValue.ProductID and
      PaymentFrequency.ID=PaymentFrequencyValue.PaymentFrequencyID and
      Product.ID = @id and
      PaymentFrequencyValue.Checked=1
return @str
end
go

--保险期间函数
create function [dbo].[fun_Duration_01](@id uniqueidentifier) returns nvarchar(1000)
as
begin
declare @str nvarchar(1000)
set @str = ''
select @str = Duration.DurationName+DurationValue.Value+','+ @str
from Product,Duration,DurationValue
where Product.ID=DurationValue.ProductID and
      Duration.ID=DurationValue.DurationID and
      Product.ID = @id and
      Duration.DurationTypeItem='保险期间' and
      DurationValue.Checked=1
return @str
end
go

--交费期间函数
create function [dbo].[fun_Duration_02](@id uniqueidentifier) returns nvarchar(1000)
as
begin
declare @str nvarchar(1000)
set @str = ''
select @str = Duration.DurationName+DurationValue.Value+','+ @str
from Product,Duration,DurationValue
where Product.ID=DurationValue.ProductID and
      Duration.ID=DurationValue.DurationID and
      Product.ID = @id and
      Duration.DurationTypeItem='交费期间' and
      DurationValue.Checked=1
return @str
end
go

--市场细分函数
create function [dbo].[fun_MarketType](@id uniqueidentifier) returns nvarchar(1000)
as
begin
declare @str nvarchar(1000)
set @str = ''
select @str = MarketType.Name + ',' + @str 
from Product,MarketType,MarketTypeValue
where Product.ID=MarketTypeValue.ProductID and
      MarketType.ID=MarketTypeValue.MarketTypeID and
      Product.ID = @id and
      MarketTypeValue.Checked=1
return @str
end
go

---主附险计划函数
create function [dbo].[fun_PrimarySecondaryInsure](@id uniqueidentifier) returns nvarchar(1000)
as
begin
declare @str nvarchar(1000)
set @str = ''
select @str = PrimarySecondaryInsure.Name
from Product,PrimarySecondaryInsure
where PrimarySecondaryInsure.ID=@id
return @str
end
go

--删除函数
drop function fun_SalesChannel
drop function fun_ExtraInsureProductType
drop function fun_CustomerRequirement
drop function fun_TargetCustomer
drop function fun_PaymentFrequency
drop function fun_Duration_01
drop function fun_Duration_02
drop function fun_MarketType
drop function fun_PrimarySecondaryInsure