if exists(select 1 from sysobjects where id=object_id('sp_getscript') and objectproperty(id,'IsProcedure')=1)
drop procedure sp_getscript
go
create procedure sp_getscript
@servername varchar(50)
,@userid varchar(50)
,@password varchar(50)
,@databasename varchar(50)
,@objectname varchar(250)
,@re varchar(8000) output
as
declare @srvid int,@dbsid int
declare @dbid int,@tbid int
declare @err int,@src varchar(255), @desc varchar(255) exec @err=sp_oacreate 'sqldmo.sqlserver',@srvid output
if @err<>0 goto lberr
if isnull(@userid,'')='' 
begin
exec @err=sp_oasetproperty @srvid,'loginsecure',-1
if @err<>0 goto lberr exec @err=sp_oamethod @srvid,'connect',null,@servername
end
else
exec @err=sp_oamethod @srvid,'connect',null,@servername,@userid,@passwordif @err<>0 goto lberrexec @err=sp_oagetproperty @srvid,'databases',@dbsid output
if @err<>0 goto lberrexec @err=sp_oamethod @dbsid,'item',@dbid output,@databasename
if @err<>0 goto lberr
exec @err=sp_oamethod @dbid,'getobjectbyname',@tbid output,@objectname
if @err<>0 goto lberr
exec @err=sp_oamethod @tbid,'script',@re output
if @err<>0 goto lberr
returnlberr:
exec sp_oageterrorinfo NULL, @src out, @desc out 
declare @errb varbinary(4)
set @errb=cast(@err as varbinary(4))
exec master..xp_varbintohexstr @errb,@re out
select ErrorCode=@re, ErrorSource=@src, ErrorDesc=@desc
returngo

解决方案 »

  1.   

    因为这是一个脚本,应用脚本支持的来实现。dbexpresse中有
      

  2.   

    用我的函数来执行,应该可以
    procedure ExecSql(const SQLText: WideString);
    var
      i:integer;
      str:tstringlist;
    begin
      str:=tstringlist.Create;
      try
        str.Text:=sqltext;
        ADOConnection1.BeginTrans;
        with adoquery1 do
          begin
            close;
            sql.Clear;
            for i:=0 to str.Count-1 do
              begin
                if ((copy(trim(str.Strings[i]),1,2)<>'/*') and
                   (copy(trim(str.Strings[i]),1,2)<>'--') and
                   (uppercase(copy(trim(str.Strings[i]),1,2))<>'GO')) then
                    SQL.Add(Str.Strings[i]);            if uppercase(copy(trim(str.Strings[i]),1,2))='GO' then
                   begin
                     try
                       ExecSQL;
                       sql.Clear;
                     except
                       on e:exception do
                          begin
                            adoconnection1.RollbackTrans;
                            ErrorBox(e.Message);
                            exit;
                          end;
                     end;
                   end;
              end;
          end;
        ADOConnection1.CommitTrans;
      finally
        str.Free;
      end;
    end;
      

  3.   

    dbexpress如何能实现,难道ado不可以吗?继续等
      

  4.   

    也可将脚本改成字符串,
    赋值给adocommand.CommandText中去啊!
      

  5.   

    你的脚本用到go 预处理语句.最好在每个go之间单独多步执行.
      

  6.   

    to lzf1010
    你的代码我试了,真的不行!不过还是要谢谢你
      

  7.   

    将语句写在文件中比如test.txt,然后读取,请参考:
    示例语句:
    if exists (select * from sysobjects where id = object_id(N'[tb_sxlz_data]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [tb_sxlz_data]
    if exists (select * from sysobjects where id = object_id(N'[tb_sxlz_report]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [tb_sxlz_report]
    上面为test.txt中内容
    ----------------------------
    代码:
           AssignFile(f,'test.txt');
            Reset(F);
            while not SeekEof(f) do
            begin
                    Readln(f,s);
                    try
                            Query1.Close;
                            Query1.SQL.Clear;
                            Query1.SQL.Add(s);
                            Query1.execsql;
                            Query1.Close;
                    except
                            closefile(f);
                            showmessage('创建数据库失败!');
                            result := False;
                            exit;
                    end;
            end;