为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8
【操作系统】:WIN11
【CPU】:
【问题描述】*:执行动态sql 时报错,请教社区各位大神一下;
报错截图:
调试:
declare
strChangeItemsText varchar(100) :='cd=1&cdtype=2&Lcdphone=3';
intChangeKind int :=1;
intAreaCode varchar(20) :='456';
strInfoId varchar(48) :='84B39F03-9446-4E3D-A2AC-0005ADDD5A31';
intid varchar(50) :='175B215B-5F75-4F86-A34D-D9C2BBD37C95';
strfields varchar(500); --字段
strconvertfields varchar(1000);--字段类型转换
begin
--字段类型转换的字段
select strconvertfields=
listagg(
substring(val,1,REGEXP_INSTR(val,'=')-1)+'=convert(varchar(256),'+substring(val,1,REGEXP_INSTR(val,'=')-1)+')'
,',')
from TABLE (KF_PUB_SPLITSTRBYCHAR(strChangeItemsText,'&'));
--字段
select strfields=
listagg(
substring(val,1,REGEXP_INSTR(val,'=')-1)+''
,',')
from TABLE(KF_PUB_SPLITSTRBYCHAR(strChangeItemsText,'&'));
EXECUTE IMMEDIATE 'select v.*, f.Alias from a f
inner join ( select id=:v,areacode=:v, fields=substring(val, 1, REGEXP_INSTR(val,''='')-1) ,
newval=substring(Val, REGEXP_INSTR( val,''='')+1, len(val))
from TABLE(KF_PUB_SPLITSTRBYCHAR(:v, ''&''))
) as v on v.areacode=f.AreaCode and v.fields=f.Item ' USING intid,intAreaCode,strChangeItemsText;
EXECUTE IMMEDIATE '
--insert into c(I_ID,areacode,fields,newval,alias,oldval)
select v.*, f.Alias, t.oldval from b f
inner join
(
select id=:v,areacode=:v, fields=substring(val, 1, REGEXP_INSTR(val,''='')-1) ,
newval=substring(val, REGEXP_INSTR(val,''='')+1, len(val))
from TABLE(KF_PUB_SPLITSTRBYCHAR(:v, ''&''))
) v on v.areacode=f.AreaCode and v.fields=f.Item
inner join
(
select :v from d where facid=:v --and areacode=:v
) aa
unpivot(
oldval for fields in(:v)
) t on v.fields=t.fields' USING intid,intAreaCode,strChangeItemsText,strconvertfields,strInfoId,strfields;
--commit;
end
问题已解决,通过拼接变量的方式传参。但是为什么using 不行?难道是因为动态列不能作为变量引用吗?