大家知道一般的存储过程用以下方法就可以实现
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).请问你们有没遇到这种问题,如何解决?
  以上两个例子不是我们存储过程,但我遇到了相同的问题。请高手帮忙。
我查了一天的网,没有在网上发现解决办法。

解决方案 »

  1.   

    //////////////////////////////////////////////
    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 执行
      

  2.   

    另外执行sql脚本的时候可以创建一个批处理.bat文件内容:@echo on echo updating db
    osql -E -d dbname -i 脚本文件名.sql 直接运行此批处理文件即可。
    osql 更详细参数用法参考sql server联机帮助
      

  3.   

    我用你的程序试了一下,没问题(d6+w2k+sql2k)
    一般地,报"参数未赋值"错的话可能是你的sql中含有":"号,解决方法没简单,只要设adoquery1的 ParamCheck为false就可以了