存储过程类的直接sql账表实现基础资料类型过滤条件多选原创
金蝶云社区-王文亮
王文亮
10人赞赏了该文章 1709次浏览 未经作者许可,禁止转载编辑于2023年05月30日 15:49:55

直接SQL账表基础资料类型关键字可以启用“多选”属性,启用以后,运行时会以 number1,number2,number3...返回基础资料编码或者名称。SQL脚本where条件使用类似  where t.FName in (#FMaterialId#)写法即可实现多选,因为系统做了特殊处理,系统运行时候会将条件替换为 where t.FName in ('name1','name2','name3'), 每个name会加个单引号上去,保证in条件可以正常执行。

但是,存储过程类型的关键字,就没有办法自动加上单引号了,因为加了之后存储过程会当成多个参数处理。

存储过程里面实际传进去的值是:name1,name2,name3,需要在过程里面自行处理,示例如下:

create  proc proc_test
@str  varchar(100)
as 
declare @t table(a varchar(100))
declare @i int
set @i=0
while @i<=len(@str)
begin
set @i=charindex(',',@str)

  if(@i=0) 
   begin
     insert @t select @str
     break
   end
   else begin 
    insert @t select ''+left(@str,@i-1) +''
    set @str=right(@str,len(@str)-@i)
   end
end

begin 
   select t0.FID
    ,t0.FDate
  , t1.FENTRYID     
       ,t0.FDOCUMENTSTATUS
       ,t2.FLOCALCURRID
       ,ISNULL(t20.FPRICEDIGITS,4) AS FPRICEDIGITS
       ,ISNULL(t20.FAMOUNTDIGITS,2) AS FAMOUNTDIGITS
       ,t1.FMATERIALID
       ,t1M_L.FNAME as FMaterialName
       ,t1.FQTY
       ,t1u.FPRECISION as FUnitPrecision
       ,t1U_L.FNAME as FUnitName
       ,t1f.FTAXPRICE
       ,t1f.FALLAMOUNT
       ,convert(varchar(20),t1f.FALLAMOUNT) as FALLAMOUNTNEW
       ,t0.FBILLNO

  from T_PUR_POORDER t0
inner join T_PUR_POORDERFIN t2 on (t0.FID = t2.FID)
  left join T_BD_CURRENCY t20 on (t2.FLOCALCURRID = t20.FCURRENCYID)
inner join T_PUR_POORDERENTRY t1 on (t0.FID = t1.FID)
  left join T_BD_MATERIAL_L t1M_L on (t1.FMATERIALID = t1m_l.FMATERIALID and t1M_L.FLOCALEID = 2052)
inner join T_PUR_POORDERENTRY_F t1F on (t1.FENTRYID = t1f.FENTRYID)
  left join T_BD_UNIT t1U on (t1f.FPRICEUNITID = t1u.FUNITID)
  left join T_BD_UNIT_L t1U_L on (t1U.FUNITID = t1U_L.FUNITID and t1U_L.FLOCALEID = 2052)
  where t1M_L.FNAME  in (select * from  @t)
end


image.png


image.png


上面的示例确实有点问题,会少一个字符串。可以改成 @毛顿 建议的写法:

DECLARE @t TABLE (a VARCHAR(100))

    DECLARE @i INT = 0

    WHILE CHARINDEX(',',@str)>0

    BEGIN

        SET @i=CHARINDEX(',',@str)

        INSERT INTO @t VALUES(''+LEFT(@str,@i-1)+'')

        SET @str=RIGHT(@str,LEN(@str)-@i)

    END

    INSERT INTO @t VALUES(@str)


赞 10