如果解决delphi执行已有存储过程报错的问题
我开发了一个更新程序,用来给客户的sql数据库打补丁。
现在遇到的问题是:更新程序是从服务器上下载sql脚本文件执行的,如果执行成功,就把服务器上的版本号设为本地的最新版本,如果执行失败就版本号不变。那么按这个逻辑,我永远都没法让客户端的版本号变成最新。
因为我有些sql脚本文件中是存储过程,如果有数据库中本来就有这个存程过程了再去执行脚本,是肯定报错的。如果我要在这个脚本中先判断是否存在再去创建过程delphi似乎没法识别这种语法,报错提示要求把create这句放在第一行。如果我这个脚本先drop删除过程再create,也不行,因为drop后肯定要用go,而delphi又不支持go。 请问我要怎么办???
[解决办法]
sqlserver的sql语句,有 if exsists 语法,判断记录,表啥的是否存在,存储过程也一样
判断存储过程是否存在 if exists (select * from sysobjects where id = object_id(N'[存储过程名]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
[解决办法]
if not exists (select * from sysobjects where id = object_id(N'[Cx_showDk]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
begin
CREATE PROCEDURE Cx_showDk
……
end
我用上面的写法,先判断,如果不存在就写入存储过程,在ADO中执行直接报错,
提示:在关键字 'PROCEDURE' 附近有语法错误。.
[解决办法]
可以不用go
不过升级方法应该要变一下,应该在数据库中建立好存储过程,升级只传参数调用即可
确实要把存储过程作成文件的,可以分细些,分离成2个或者多个sql文件,然后逐一执行
[解决办法]
- Delphi(Pascal) code
procedure TForm1.Button1Click(Sender: TObject);var sql:string;begin sql := 'IF EXISTS (SELECT * FROM dbo.sysobjects where id= OBJECT_ID(N''[dbo].[LD_UpdateWater]'') AND type in (N''P'', N''PC''))' +' drop procedure LD_UpdateWater '; adoquery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Text := sql; ADOQuery1.ExecSQL;end;