我的存储过程是从SQL Server 中生成的,想用Delphi控件执行SQL脚本,达到更新存储过程的目的,现发现有两个问题:
1、SQL脚本中的GO语言,Delphi不支持,运行出错(这个可以解决)。
2、因为SQL脚本是先将存储过程删除,再建立的,即CREATE PROCEDURE前面肯定还有别的语句,而Delphi的提示是“CREATE PROCEDURE在查询中必须是第一条语句”,一直解决不了!!请问有好的解决办法吗?

解决方案 »

  1.   

    1、执行“DROP PROCEDURE”语句
    2、执行“CREATE PROCEDURE”语句
    注意:以上两个语句分两次先后执行,不要把两个语句放在一起执行
      

  2.   

    WinExec(osql -Usa -P -S(local) -dDataBase -i"1.sql"');
      

  3.   

    好长时间没有看到我们的大斑竹 “windindance(风舞轻扬) ”回答问题了。不过上面有个问题,要是别人没有安装 SQL 的客户端怎么办??
    其实遇到 SQL 中的那些 GO 之后,就提交到服务器执行就可以了。GO 并不是真正的 SQL 语句。
      

  4.   

    难道真的只能找到一个GO,就取出其前面的SQL语言执行后,再往下找直到最后?shuangsa(双萨) 
    这叫是正确答案啊???一个*.sql包含多个更新存储过程的代码,问题是如何把*.sql文件(我把它解析存在一个字段里)按GO#13#10分割执行!windindance(风舞轻扬) 
    你的做法我想过,主要是客户端不一定安装了SQL查询分析器。
      

  5.   

    caoyq(草民呆瓜) 
    这叫是正确答案啊???
      

  6.   

    我试过用ShellExecute(Application.Handle, 'open', 'C:\Program Files\Microsoft SQL Server\80\Tools\Binn\isqlw.exe',
        'isqlw /U sa /P /S lzx /d chss /q /f d:\CreateSp.sql', nil, SW_HIDE);我怎么只是把*.sql文件装载进来了,而且查询分析器显示出来了,它不运行,上面的代码有什么问题(isqlw和/q有无都一样)??
      

  7.   

    服务器有没有SQL文件?
    如果有,这样行不行?
    在存储过程中使用
    exec xp_cmdshell 'osql ....'
      

  8.   

    或者软件中绑定osql.exe行不行?
      

  9.   

    服务器端的 osql 执行要装入 SQL 文件,要是这个文件在客户端怎么办?
      

  10.   

    这个文件为什么要在客户端?
    如果必须要在客户端执行,那就让他装个SQL 客户端好了,要不在安装程序中安装MSDE也行。
    或者……你用SOCKET把文件传到服务器……好笨的方法……*^-^*
      

  11.   

    因为SQL SERVER的块语句执行的以GO为块分隔,而Create Procedure一定是要在块的第一句,而TQuery或是TADOQuery都是执行一块语句的,不支持GO。所以你只有分开运行,楼上的有些是可行的,但是如果服务器和客户端是分开的(而且多数都是这样子的,我想只有程序员的才是一台机)就根本没用了。搜索GO是不现实了,比如你要执行脚本文件时,无法保证变量或是字段名称中不包含GO的。我的解决方法笨的一些,但还是有用的。我自己在脚本里每个块与块之间用固定个数的‘----...’分隔,然后运行时扫到该行就让Query执行一次。这样就是可能会运行很多次Query了。
      

  12.   

    在服务器端编写一个存储过程,用他来执行DROP CREATE 或ALTER操作,这样在客户端只需调用这个存储过程,而且避免了两次分别调用DROP CREATE万一后一句CREATE出错而引起存储过程丢失。
      

  13.   

    我好象还发现个问题,就是ADO的一个控件好象不支持标签,而TDataBase控件可以,象下面的代码(只是试验用的):
    if 1 < 2
      goto tt
    commit tran
    tt:
      return在ADO下运行出错,而TDataBase里可以通过!hfclql(三毛):
       我试了搜索GO#13可以实现!
      

  14.   

    还有个问题,用WinExec、ShellExecute调用isql如何捕获sql的具体错误呢,看帮助说返回值小于31(32),就说明出错了,但好象不太正确,如:
    WinExec(PChar('isql -Usa -P -Slzx -dchss -i"d:\dcreatesp.sql"'), SW_Hide);文件d:\dcreatesp.sql不存在,它的返回值是33,这怎么解决?
      

  15.   

    我看了,不管执行成功与否,winexec返回值都是33,奇怪!!