数据库: sql server准备写一个程序做数据库的升级, 有很多数据库升级的脚本, 都是一个个sql文件.通过调用这些脚本, 对数据库进行升级, 可能会Create table, alter table, create PROCEDURE等等.
有什么好的办法? 
准备了很多数据库升级的脚本, 比如下面是041122.sql/* ------------------------------------------------------------   DESCRIPTION:  Synchronization Script for Object(s)    AUTHOR: [Insert Author Name]   DATE: 2004-11-22 13:47:50   ------------------------------------------------------------ */SET NOEXEC OFF
SET ANSI_WARNINGS ON
SET XACT_ABORT ON
GO
-- =======================================================
-- Synchronization Script for: [dbo].[DAILY_INV]
-- =======================================================
Print '[dbo].[DAILY_INV] is identical so no merge script will be generated'
GOCREATE TABLE [dbo].[DAILY_INV] (
    [DAILY_INV_ID] varchar(22) NOT NULL,
    [DAILY_INV_NO] varchar(16) NOT NULL,
    [CREATE_DATE] datetime NOT NULL,
    [CREATE_USER_ID] varchar(16) NOT NULL,
    [BILL_DATE] datetime NULL,
)
GOALTER TABLE [dbo].[DAILY_INV] ADD PRIMARY KEY ([DAILY_INV_ID])
GO

解决方案 »

  1.   

    我现在是这样弄的:1, 连接数据库;
    2, 创建一个adoquery;
    3, 打开脚本文件, 把脚本里的脚本赋给一个字串sSQL    AssignFile(sqlFile,sqlFileName);
        Reset(sqlFile);    while not Eof(sqlFile) do
        begin
            ReadLn(sqlFile,sTemp);
            //如果是注释,或者数据库设置, 跳过
            if LeftBStr(sTemp, 2) = '--' then continue;
            if LeftBStr(sTemp, 3) = 'SET' then continue;
            if LeftBStr(sTemp, 2) = 'GO' then continue;
            if LeftBStr(sTemp, 2) = 'IF' then continue;
            if LeftBStr(sTemp, 5) = 'Print' then continue;
            sSQL := sSQL + sTemp;
        end;
        CloseFile(sqlFile); 4, 将sSQL赋给adoquery;
     5, adoquery.ExecSQL这样觉得不是很爽.
      

  2.   

    建一个bat批处理文件,双击就运行
      

  3.   

    >> 直接调用Osql运行.sql文件这个在程序里怎么调用? 谢谢!>>建一个bat批处理文件,双击就运行
    这个不够专业吧.
      

  4.   

    你可以象Xdoclet一样,在sql脚本中注释部分定义自己的代码,在解析的时候只解析你的分隔符,例如
    --@myslt
    create.......--@myslt
    alter..当然方法和你的其实是一样的
      

  5.   

    var
      StartUpInfo:TStartUpInfo;
      proInfo:TProcessInformation;
    begin
      CreateProcess(nil,pchar('isqlw.exe  -S servername -d databasename -U username -P password -i 041122.sql -o outputfilename'),
             nil,nil,false,NORMAL_PRIORITY_CLASS,nil,nil,StartUpInfo,ProInfo);
      while GetProcessVersion(ProInfo.dwProcessId)<>0 do sleep(10);
      -- 执行结束
    end
      

  6.   

    按照 yzssg(小马)的办法, 我调用Osql来执行这些sql:
        sCmd := 'osql /U ' + Trim(edtUser.Text)
                + ' /P ' + Trim(edtPassword.Text)
                + ' /b0  /S ' + Trim(edtServer.Text)
                + ' /d ' + Trim(edtDb.Text)
                + ' /i ' + sqlFileName
                + ' /o ' + sLogFile;
        Winexec(@scmd[1], 0);执行成功了.但是还有个问题, 因为Osql是系统的程序, 我怎么来在我自己的程序里捕捉错误?  谢谢!
    kasteboy(), 用isqlw和Osql来执行有什么差别? 另外, 你的代码我执行的时候好像会出错^_^