在Delphi中,用SQL脚本更新存储过程?

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

请问有好的解决办法吗?
...全文
185 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wakeupsleep 2002-11-11
  • 打赏
  • 举报
回复
我看了,不管执行成功与否,winexec返回值都是33,奇怪!!
wakeupsleep 2002-11-11
  • 打赏
  • 举报
回复
还有个问题,用WinExec、ShellExecute调用isql如何捕获sql的具体错误呢,看帮助说返回值小于31(32),就说明出错了,但好象不太正确,如:
WinExec(PChar('isql -Usa -P -Slzx -dchss -i"d:\dcreatesp.sql"'), SW_Hide);

文件d:\dcreatesp.sql不存在,它的返回值是33,这怎么解决?
wakeupsleep 2002-11-11
  • 打赏
  • 举报
回复
我好象还发现个问题,就是ADO的一个控件好象不支持标签,而TDataBase控件可以,象下面的代码(只是试验用的):
if 1 < 2
goto tt
commit tran
tt:
return

在ADO下运行出错,而TDataBase里可以通过!

hfclql(三毛):
我试了搜索GO#13可以实现!
firetoucher 2002-11-09
  • 打赏
  • 举报
回复
在服务器端编写一个存储过程,用他来执行DROP CREATE 或ALTER操作,这样在客户端只需调用这个存储过程,而且避免了两次分别调用DROP CREATE万一后一句CREATE出错而引起存储过程丢失。
腊月三毛 2002-11-09
  • 打赏
  • 举报
回复
因为SQL SERVER的块语句执行的以GO为块分隔,而Create Procedure一定是要在块的第一句,而TQuery或是TADOQuery都是执行一块语句的,不支持GO。所以你只有分开运行,楼上的有些是可行的,但是如果服务器和客户端是分开的(而且多数都是这样子的,我想只有程序员的才是一台机)就根本没用了。搜索GO是不现实了,比如你要执行脚本文件时,无法保证变量或是字段名称中不包含GO的。我的解决方法笨的一些,但还是有用的。我自己在脚本里每个块与块之间用固定个数的‘----...’分隔,然后运行时扫到该行就让Query执行一次。这样就是可能会运行很多次Query了。
windindance 2002-11-09
  • 打赏
  • 举报
回复
这个文件为什么要在客户端?
如果必须要在客户端执行,那就让他装个SQL 客户端好了,要不在安装程序中安装MSDE也行。
或者……你用SOCKET把文件传到服务器……好笨的方法……*^-^*
CloneCenter 2002-11-08
  • 打赏
  • 举报
回复
服务器端的 osql 执行要装入 SQL 文件,要是这个文件在客户端怎么办?
windindance 2002-11-08
  • 打赏
  • 举报
回复
或者软件中绑定osql.exe行不行?
windindance 2002-11-08
  • 打赏
  • 举报
回复
服务器有没有SQL文件?
如果有,这样行不行?
在存储过程中使用
exec xp_cmdshell 'osql ....'
wakeupsleep 2002-11-08
  • 打赏
  • 举报
回复
我试过用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有无都一样)??
wakeupsleep 2002-11-08
  • 打赏
  • 举报
回复
caoyq(草民呆瓜)
这叫是正确答案啊???
wakeupsleep 2002-11-08
  • 打赏
  • 举报
回复
难道真的只能找到一个GO,就取出其前面的SQL语言执行后,再往下找直到最后?

shuangsa(双萨)
这叫是正确答案啊???一个*.sql包含多个更新存储过程的代码,问题是如何把*.sql文件(我把它解析存在一个字段里)按GO#13#10分割执行!

windindance(风舞轻扬)
你的做法我想过,主要是客户端不一定安装了SQL查询分析器。

CloneCenter 2002-11-08
  • 打赏
  • 举报
回复
好长时间没有看到我们的大斑竹 “windindance(风舞轻扬) ”回答问题了。不过上面有个问题,要是别人没有安装 SQL 的客户端怎么办??
其实遇到 SQL 中的那些 GO 之后,就提交到服务器执行就可以了。GO 并不是真正的 SQL 语句。
windindance 2002-11-08
  • 打赏
  • 举报
回复
WinExec(osql -Usa -P -S(local) -dDataBase -i"1.sql"');
caoyq 2002-11-08
  • 打赏
  • 举报
回复
回答正确。给分吧。
shuangsa 2002-11-08
  • 打赏
  • 举报
回复
1、执行“DROP PROCEDURE”语句
2、执行“CREATE PROCEDURE”语句
注意:以上两个语句分两次先后执行,不要把两个语句放在一起执行

2,507

社区成员

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

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