我开发了一个更新程序,用来给客户的sql数据库打补丁。现在遇到的问题是:更新程序是从服务器上下载sql脚本文件执行的,如果执行成功,就把服务器上的版本号设为本地的最新版本,如果执行失败就版本号不变。那么按这个逻辑,我永远都没法让客户端的版本号变成最新。因为我有些sql脚本文件中是存储过程,如果有数据库中本来就有这个存程过程了再去执行脚本,是肯定报错的。如果我要在这个脚本中先判断是否存在再去创建过程delphi似乎没法识别这种语法,报错提示要求把create这句放在第一行。如果我这个脚本先drop删除过程再create,也不行,因为drop后肯定要用go,而delphi又不支持go。 请问我要怎么办???

解决方案 »

  1.   

    sqlserver的sql语句,有 if exsists 语法,判断记录,表啥的是否存在,存储过程也一样判断存储过程是否存在 if exists (select * from sysobjects where id = object_id(N'[存储过程名]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
      

  2.   

    回楼上,ado不支持这么写,会报错的。我前面说过也试过的
      

  3.   

    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' 附近有语法错误。.
      

  4.   

    可以不用go不过升级方法应该要变一下,应该在数据库中建立好存储过程,升级只传参数调用即可
    确实要把存储过程作成文件的,可以分细些,分离成2个或者多个sql文件,然后逐一执行
      

  5.   

    你可以把  if exsists  写你脚本里  执行的时候脚本判断 你调用就即可
      

  6.   


    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;
    这么写没问题
      

  7.   


    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;
    脚本这么写 调用即可
      

  8.   

    2种方式
    1:按照heqxmail兄弟那样,直接执行脚本
    2:delphi里面做,但是分2部,没让你把所有的步骤一次执行,先执行zzflover兄弟说的Drop,然后ADOQuery1再加载一次Create就可以了