大家知道一般的存储过程用以下方法就可以实现
with adoquery1 do
begin
close;
sql.clear;
sql.LoadFromFile('mysql.sql');
execsql;
end;但如果存储过程的形式是:
CREATE PROCEDURE ZchtMoneyHand @jieZhiDate varchar(10),@ziJinHandLv decimal(18,6),@buTieDay int,
@pianqu varchar(100),@yunyingShang varchar(100),@productType varchar(100),@firstDayInYear varchar(10)
ASdeclare @cndtnStr1 nvarchar(1000)
set @cndtnStr1=''if (@yunyingShang<>'')
set @cndtnStr1=@cndtnStr1+' A.yunyingShang like ''%'+@yunyingShang+'%'' and '
if (@pianqu<>'')
set @cndtnStr1=@cndtnStr1+' A.pianqu like ''%'+@pianqu+'%'' and '
if (@productType<>'')
set @cndtnStr1=@cndtnStr1+' A.productType like ''%'+@productType+'%'' and '
if (@cndtnStr1<>'')
set @cndtnStr1=' and '+LEFT(@cndtnStr1,LEN(@cndtnStr1)-4)
declare @mainStr1 nvarchar(4000)
declare @mainStr2 nvarchar(4000)
declare @mainStr3 nvarchar(4000)set @mainStr1='--省略---';
set @mainStr2='--省略---';
set @mainStr3='--省略---';exec (@mainStr1+@mainStr2+@mainStr3+@cndtnStr1)在delphi里运行的时候报错说参数未赋值(注:这个存储过程是完全正确的),而创建那种非动态字符串构造的存储过程就不会出错(因为其中不需要exec).请问你们有没遇到这种问题,如何解决?
以上两个例子不是我们存储过程,但我遇到了相同的问题。请高手帮忙。
我查了一天的网,没有在网上发现解决办法。
with adoquery1 do
begin
close;
sql.clear;
sql.LoadFromFile('mysql.sql');
execsql;
end;但如果存储过程的形式是:
CREATE PROCEDURE ZchtMoneyHand @jieZhiDate varchar(10),@ziJinHandLv decimal(18,6),@buTieDay int,
@pianqu varchar(100),@yunyingShang varchar(100),@productType varchar(100),@firstDayInYear varchar(10)
ASdeclare @cndtnStr1 nvarchar(1000)
set @cndtnStr1=''if (@yunyingShang<>'')
set @cndtnStr1=@cndtnStr1+' A.yunyingShang like ''%'+@yunyingShang+'%'' and '
if (@pianqu<>'')
set @cndtnStr1=@cndtnStr1+' A.pianqu like ''%'+@pianqu+'%'' and '
if (@productType<>'')
set @cndtnStr1=@cndtnStr1+' A.productType like ''%'+@productType+'%'' and '
if (@cndtnStr1<>'')
set @cndtnStr1=' and '+LEFT(@cndtnStr1,LEN(@cndtnStr1)-4)
declare @mainStr1 nvarchar(4000)
declare @mainStr2 nvarchar(4000)
declare @mainStr3 nvarchar(4000)set @mainStr1='--省略---';
set @mainStr2='--省略---';
set @mainStr3='--省略---';exec (@mainStr1+@mainStr2+@mainStr3+@cndtnStr1)在delphi里运行的时候报错说参数未赋值(注:这个存储过程是完全正确的),而创建那种非动态字符串构造的存储过程就不会出错(因为其中不需要exec).请问你们有没遇到这种问题,如何解决?
以上两个例子不是我们存储过程,但我遇到了相同的问题。请高手帮忙。
我查了一天的网,没有在网上发现解决办法。
if (@yunyingShang<>'')
set @cndtnStr1=@cndtnStr1+' A.yunyingShang like ''%'+@yunyingShang+'%'' and '
if (@pianqu<>'')
set @cndtnStr1=@cndtnStr1+' A.pianqu like ''%'+@pianqu+'%'' and '
if (@productType<>'')
set @cndtnStr1=@cndtnStr1+' A.productType like ''%'+@productType+'%'' and '
if (@cndtnStr1<>'')
set @cndtnStr1=' and '+LEFT(@cndtnStr1,LEN(@cndtnStr1)-4)exec (@mainStr1+@mainStr2+@mainStr3+@cndtnStr1)
////////////////////////////////////////////////////这么动态生成sql字符串再执行,效率不高,方法不够好我的做法:
select *
from table_name
where (@yunyingShang is null or @yunyingShang = '' or yunyingShang like @yunyingShang + '%')
and (@pianquis null or @pianqu= '' or pianqu like @yunyingShang + '%')
这样的写法sql语句会进行预编译,效率较高,尽量不要用 Exec 执行
osql -E -d dbname -i 脚本文件名.sql 直接运行此批处理文件即可。
osql 更详细参数用法参考sql server联机帮助
一般地,报"参数未赋值"错的话可能是你的sql中含有":"号,解决方法没简单,只要设adoquery1的 ParamCheck为false就可以了