动态生成存储过程问题,急!请高手帮忙

pdbird 2006-03-28 05:12:00
大家知道一般的存储过程用以下方法就可以实现
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)
AS

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

...全文
118 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
柯本 2006-03-28
  • 打赏
  • 举报
回复
我用你的程序试了一下,没问题(d6+w2k+sql2k)
一般地,报"参数未赋值"错的话可能是你的sql中含有":"号,解决方法没简单,只要设adoquery1的 ParamCheck为false就可以了
hanlin2004 2006-03-28
  • 打赏
  • 举报
回复
另外执行sql脚本的时候可以创建一个批处理.bat文件

内容:

@echo on

echo updating db
osql -E -d dbname -i 脚本文件名.sql

直接运行此批处理文件即可。
osql 更详细参数用法参考sql server联机帮助
hanlin2004 2006-03-28
  • 打赏
  • 举报
回复
//////////////////////////////////////////////
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 执行
pdbird 2006-03-28
  • 打赏
  • 举报
回复
因为我现在在做一个动态生成数据库结构的工具,所以才发现这个问题。
在生成动态存储过程时,有部分能生成,有部分就会报错。
希望遇到此问题,并解决过的兄弟给个提示谢了。
当然也欢迎所有的兄弟畅所欲言。

2,498

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧