存储过程类的直接sql账表实现基础资料类型过滤条件多选原创
11人赞赏了该文章
2,191次浏览
编辑于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
上面的示例确实有点问题,会少一个字符串。可以改成 @毛顿 建议的写法:
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)
赞 11
11人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读