怎样在delphi里生成一个sql server的存储过程?即存储过程在前台程序动态生成。

解决方案 »

  1.   

    没试过;
    不过想当然认为应该给静态创建是一样的吧;
    with adoquery1 do
    begin
      close;
      sql.clear;
      sql.text := 'create proc proc_name ..';
      execsql;
    end;你试试看;关注高手的解答。。
      

  2.   

    我希望以.sql文件的形式load进来,否则那么长一个存储过程写在delphi里岂不累死,也不美观。:-)  但不知道具体怎么做?
      

  3.   

    完全可以。
    我常这么做。
    每次为客户新建系统时候需要生成数据库的存储过程,就是用DELPHI做一个提交工具,把这些SQL语句提交就行了。
    只需注意“go”是查询分析器用的分界符,不是合法的SQL语句。
      

  4.   

    to SeaWave(NoSound):如何以文件的形式把.sql加进来?
      

  5.   

    function InitStoredProc(SP:TStoredProc;StoredProcName:string;
      CheckCount:integer):Boolean;
    var
      Params: TParams;
    begin
      Params := TParams.Create(nil);
      try
        if SP.Active then
          SP.Close;
        SP.StoredProcName:=StoredProcName;
        SP.CopyParams(Params);
        if CheckCount>=0 then   //检查参数的个数是否符合前台程序的要求//
        begin
          if SP.Params.Count=CheckCount then
            result:=true
          else
            result:=false;
        end
        else
        begin
          result:=true;
        end;
      finally
        Params.Free;
      end;
    end;
      

  6.   

    结合 natasha(月不常满) 与 SeaWave(NoSound) 的回复就是我要的答案!谢谢楼上各位!to  WindowsAPI(风暴) :我是创建存储过程,不是调用哦。
      

  7.   

    现在碰到个问题:如果是普通的存储过程,使用loadfromfile没有问题,但如果存储过程的形式是:
    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).请问你们有没遇到这种问题,如何解决?谢谢!
      

  8.   

    呵呵,这样吧,我详细一点说一下,希望对你有所帮助。
    假定我们已有一个名为“mysp.sql”的文件,里面的内容如下:if exists(select * from sysobjects where name='my_proc')
      drop proc my_proc
    go
    create proc my_proc as select 'Hello!'这是一个示例,实际应用于这个文件可能会很长,包含很多段。在查询分析器里可以装入这个SQL文件并正确执行它,执行后就生成了一个名为my_proc的存储过程。如果想在DELPHI里用,那么要注意,go这一行,其实是查询分析器用的,用来分开必须分开的SQL语句,比方说create proc必须是第一句SQL语句,所以它前面要用go来与上面的SQL语句分开。
    所以在DELPHI里,不能简单地:
    with adoquery1 do
    begin
      close;
      sql.clear;
      sql.LoadFromFile('mysql.sql');
      execsql;
    end;
    这样做执行到GO语句时,就会提示无效的SQL语句。
    正确的做法是:把.SQL文件用LoadFromFile方法装入到一个TStringList中,然后一行一行地加到ADOQuery的SQL中,加到“go”这一句就停止,执行SQL后(ExecSQL),再重新装入后面的SQL语句,循环处理,直到所有SQL语句被处理完成。
      

  9.   

    关于动态执行的问题(即你上面所列出的exec ()),我也用过,没有发现什么问题,可以正常执行,但是有一个条件,就是当前连接到SQL的用户对于该数据库来说,一定要有足够的权限,也就是说,一般要是dbo才行,否则会报错。
      

  10.   

    谢谢SeaWave(NoSound)!我后来用的方法如你所说。只是csdn限定了不能连续回复三次,所以当时就只好“无结果”地结贴了。以后还请多多指教!