我开发了一个更新程序,用来给客户的sql数据库打补丁。现在遇到的问题是:更新程序是从服务器上下载sql脚本文件执行的,如果执行成功,就把服务器上的版本号设为本地的最新版本,如果执行失败就版本号不变。那么按这个逻辑,我永远都没法让客户端的版本号变成最新。因为我有些sql脚本文件中是存储过程,如果有数据库中本来就有这个存程过程了再去执行脚本,是肯定报错的。如果我要在这个脚本中先判断是否存在再去创建过程delphi似乎没法识别这种语法,报错提示要求把create这句放在第一行。如果我这个脚本先drop删除过程再create,也不行,因为drop后肯定要用go,而delphi又不支持go。 请问我要怎么办???
begin CREATE PROCEDURE Cx_showDk
……
end我用上面的写法,先判断,如果不存在就写入存储过程,在ADO中执行直接报错,提示:在关键字 'PROCEDURE' 附近有语法错误。.
确实要把存储过程作成文件的,可以分细些,分离成2个或者多个sql文件,然后逐一执行
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;
这么写没问题
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id =
object_id(N'[MeetingManager].[RecordError]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE [MeetingManager].[RecordError]
GO
CREATE PROCEDURE [MeetingManager].[RecordError](
@InProcName Varchar(30),
@InLineId Numeric(4,0),
@InCode Numeric(10,0),
@InSqlError Varchar(200),
@InUserInfor Varchar(50))
AS
DECLARE @V_iErrid Numeric(5,0)
BEGIN
.....
END;
脚本这么写 调用即可
1:按照heqxmail兄弟那样,直接执行脚本
2:delphi里面做,但是分2部,没让你把所有的步骤一次执行,先执行zzflover兄弟说的Drop,然后ADOQuery1再加载一次Create就可以了