求备份数据库中的某一个表的备份方法或是sql语句

时间:2022-07-16 13:48:18
大家好,我现在想备份sqlserver 2000中的一个数据库中的某一个表,不知道才用什么方法,我知道有个bcp可是我看了帮助也不会用,我不希望大家在把帮助给我帖进来,如果给我解释一个下也可以的,最好是给我一段代码,我的sqlserver 2000 验证是用“仅windows",采用系统账号运行 我机器的用户名是 administrator  密码是12345
请大家帮忙解决
谢谢
分数我可以在加

14 个解决方案

#1


windows和sql server身份验证,这样子是可以的

bcp "mydb..mytable " out "d:\outtable.txt" -c  -U"sa" -P"pass"

#2


在SQLSERVER2000中的备份只能对整个库进行操作,生成备份文件。
至于单个表的备份可用导入导出操作来完成,此项操作在企业管理器中选择单个表按右键就能找到,导入(还原)导出(备份)操作有向导程序。
用命令导入导出如yingyys所写,具体参数可参照SQLSERVER帮助。

#3


用个SQL语句是可以的,你用一个ADOQuery控件,然后设置它的SQL语名为以下:

DUMP TABLE 数据库中的表名 TO 你要备份的表名 WITH STATS

然后ExecSQL就可以备份你的数据库表啦。

#4



void __fastcall TfrmClearData::BackupDatabase(void)
{
String dir,deleteDir;
ffblk ffblk;
dir = ExtractFilePath(ParamStr(0)) + "\\DataBaseBuckup\\";
if(!DirectoryExists(dir)){
     CreateDir(dir);
}

BackupTable("tb_TranProcess",dir);
BackupTable("tb_PresentTranProcess",dir);
BackupTable("tb_CumulateDot",dir);
BackupTable("tb_ForwardDot",dir);
}
//---------------------------------------------------------------------------
void __fastcall TfrmClearData::BackupTable(String TableName,String BackupPath)
{
int i;
String FieldStr,FullFileName;
String StrBackUpSql;
FullFileName = BackupPath + "\\" + TableName + ".bak";
if(FileExists(FullFileName))
     DeleteFile(FullFileName);

TStringList *TableDataList = new TStringList;
TADOQuery *ADOQueryBackupTable = new TADOQuery(Application);
StrBackUpSql = "Select * from " + TableName;
try{
comm->ExecuteSelectSQL(StrBackUpSql,ADOQueryBackupTable);
}
catch(...){
    Application->MessageBoxA("数据库出错,请联系系统管理员!","错误", MB_OK|MB_ICONSTOP);
    return;
}
TableDataList->Clear();
while(!ADOQueryBackupTable->Eof){
     FieldStr = "";
     for(i=0;i<ADOQueryBackupTable->Fields->Count;i++){
          if(ADOQueryBackupTable->Fields->Fields[i]->IsNull || ADOQueryBackupTable->Fields->Fields[i]->AsString=="")
               FieldStr += " #*#$#*#";
          else
               FieldStr += ADOQueryBackupTable->Fields->Fields[i]->AsString + "#*#$#*#";
     }
     TableDataList->Add(FieldStr);
     ADOQueryBackupTable->Next();
}
try{
     TableDataList->SaveToFile(FullFileName);
     FailFlag += 1;
}catch(...){
     fFlag += 1;
}
if(FailFlag==4)
     //Application->MessageBoxA("备份成功!","消息",MB_OK|MB_ICONINFORMATION);
if(fFlag>0)
     Application->MessageBoxA("执行操作时发生了异常错误,数据库备份没有成功,\n请稍后重试或者联系数据库管理员","错误",MB_OK|MB_ICONSTOP);
ADOQueryBackupTable->Close();
delete ADOQueryBackupTable;
ADOQueryBackupTable = NULL;

}
//---------------------------------------------------------------------------
void __fastcall TfrmClearData::DeleteDir(String dir)
{
char Path[256];
SHFILEOPSTRUCT sfo;
memset(&sfo,0,sizeof(sfo));
memset(Path,0,sizeof(Path));
strcpy(Path,dir.c_str());
sfo.wFunc = FO_DELETE;
sfo.pFrom = Path;
sfo.fFlags = FOF_NOCONFIRMATION;
SHFileOperation(&sfo);
}

#5


starstargao(高顾) 那要是把备份的表还原又怎么处理呀
难道没有sql语句可以实现吗?

#6


应该可以的
查询一下SQL手册

#7


void RestoreDatabase(String FilePath)
{
if(FileExists(FilePath+"\\sys_fee_total.bak"))
     WriteToTable("sys_fee_total",FilePath+"\\sys_fee_total.bak",10);

if(FileExists(FilePath+"\\tran_ls.bak"))
     WriteToTable("tran_ls",FilePath+"\\tran_ls.bak",14);

if(FileExists(FilePath+"\\user_fee.bak"))
     WriteToTable("user_fee",FilePath+"\\user_fee.bak",14);

if(FileExists(FilePath+"\\user_info.bak"))
     WriteToTable("user_info",FilePath+"\\user_info.bak",27);

if(FileExists(FilePath+"\\user_tran.bak"))
     WriteToTable("user_tran",FilePath+"\\user_tran.bak",9);

if(FileExists(FilePath+"\\work_manager.bak"))
     WriteToTable("work_manager",FilePath+"\\work_manager.bak",14);
}
//---------------------------------------------------------------------------
void WriteToTable(String TableName,String DataFilePath,int FieldCount)
{
TADOQuery *RestoreQuery = new TADOQuery(Application);
RestoreQuery->Connection = catvmain->ADOConnection1;
FILE *stream;
char ALineData[10000],*p;
int len =10000,myCount;
String sql;
stream = fopen(DataFilePath.c_str(), "r");
if(stream){
     RestoreQuery->Close();
     RestoreQuery->SQL->Clear();
     RestoreQuery->SQL->Text = "delete from " + TableName;
     RestoreQuery->ExecSQL();
     while(fgets(ALineData, len, stream)){
          myCount = FieldCount;
          sql = "insert into "+TableName +" values(";
          p = strtok(ALineData,"#*#$#*#");
          if(p){
               sql += "'"+AnsiString(p)+"'";
               myCount -= 1;
          }
          while(p){
               p = strtok(NULL,"#*#$#*#");
               if(p && myCount>0){
                    if(AnsiString(p).Trim()=="")
                         sql += ",null";
                    else
                         sql += ",'"+AnsiString(p)+"'";
                    myCount -= 1;
               }
          }
          sql += ")";
          RestoreQuery->Close();
          RestoreQuery->SQL->Clear();
          RestoreQuery->SQL->Text = sql;
          try{
               RestoreQuery->ExecSQL();
          }catch(...){
               continue;
          }
     }
}
fclose(stream);
}

#8


select * into bak from table

#9


如果一定要用bcp的话,这是我曾经用过的办法.
我使用这个方法的平台是WINDOWS 2000+SQL SERVER 2000.
SQL SERVER的登陆方式是WINDOWS认证.
先在TFORM里面放一个TADOQUERY,假设TADOQUERY的名字是ADOQUERY1,里面可以填写SQL语句.
把master数据库里面的表a导出到a.txt的SQL语句:
EXEC master..xp_cmdshell 'bcp master.dbo.a out c:\a.txt -c -S(local) -T'
把a.txt导入到bak数据库里面的表a的SQL语句:
EXEC master..xp_cmdshell 'bcp master.dbo.a in c:\a.txt -c -S(local) -T'
不知道你需不需要用到这些东西,希望对你有帮助.

#10


在SQL 2000中,系统只提供这个数据库的备份,而如果要备份单个表的,要么用SQL语句将表中的记录导入的另一个备份表中,还原时,在从备份表中将记录写入原来的表,就可以了;要么就用系统系统的导入/导出操作,将表的记录导入/导出。我就是这么做的,不过自己写语句方便一些,毕竟一切尽在掌握中嘛!:)

#11


最省事的办法:
用ADOTABLE 连接到要备份的数据表,用ADOTABLE->SaveToFile(filename)将数据备份到指定的文件中,用ADOTABLE->LoadFromFile(filename)将数据恢复

大家出了这么多主意,快散分吧!

#12


gz

#13


To : pqx2002(阿潘) 
你好,你的方法很好,我现在有个问题就是:当我把表备份了,可是当我还原的时候我的数据库中的表的结构已经改变了,也就是我的字段和我备份的表的字段不吻合了,那他还能成功吗,这样的情况我应该怎么办呀,谢谢

#14


如果数据结构改变了,可以先将数据恢复到临时表,再用 insert 语句对齐字段插入了,注意要判断记录是否存在关键字重复。不过老兄,你似乎不用考虑这么多吧,数据结构都改,那你最好做一个独立的恢复工具,用来对齐两个表的字段,同时检测是否主键冲突。

#1


windows和sql server身份验证,这样子是可以的

bcp "mydb..mytable " out "d:\outtable.txt" -c  -U"sa" -P"pass"

#2


在SQLSERVER2000中的备份只能对整个库进行操作,生成备份文件。
至于单个表的备份可用导入导出操作来完成,此项操作在企业管理器中选择单个表按右键就能找到,导入(还原)导出(备份)操作有向导程序。
用命令导入导出如yingyys所写,具体参数可参照SQLSERVER帮助。

#3


用个SQL语句是可以的,你用一个ADOQuery控件,然后设置它的SQL语名为以下:

DUMP TABLE 数据库中的表名 TO 你要备份的表名 WITH STATS

然后ExecSQL就可以备份你的数据库表啦。

#4



void __fastcall TfrmClearData::BackupDatabase(void)
{
String dir,deleteDir;
ffblk ffblk;
dir = ExtractFilePath(ParamStr(0)) + "\\DataBaseBuckup\\";
if(!DirectoryExists(dir)){
     CreateDir(dir);
}

BackupTable("tb_TranProcess",dir);
BackupTable("tb_PresentTranProcess",dir);
BackupTable("tb_CumulateDot",dir);
BackupTable("tb_ForwardDot",dir);
}
//---------------------------------------------------------------------------
void __fastcall TfrmClearData::BackupTable(String TableName,String BackupPath)
{
int i;
String FieldStr,FullFileName;
String StrBackUpSql;
FullFileName = BackupPath + "\\" + TableName + ".bak";
if(FileExists(FullFileName))
     DeleteFile(FullFileName);

TStringList *TableDataList = new TStringList;
TADOQuery *ADOQueryBackupTable = new TADOQuery(Application);
StrBackUpSql = "Select * from " + TableName;
try{
comm->ExecuteSelectSQL(StrBackUpSql,ADOQueryBackupTable);
}
catch(...){
    Application->MessageBoxA("数据库出错,请联系系统管理员!","错误", MB_OK|MB_ICONSTOP);
    return;
}
TableDataList->Clear();
while(!ADOQueryBackupTable->Eof){
     FieldStr = "";
     for(i=0;i<ADOQueryBackupTable->Fields->Count;i++){
          if(ADOQueryBackupTable->Fields->Fields[i]->IsNull || ADOQueryBackupTable->Fields->Fields[i]->AsString=="")
               FieldStr += " #*#$#*#";
          else
               FieldStr += ADOQueryBackupTable->Fields->Fields[i]->AsString + "#*#$#*#";
     }
     TableDataList->Add(FieldStr);
     ADOQueryBackupTable->Next();
}
try{
     TableDataList->SaveToFile(FullFileName);
     FailFlag += 1;
}catch(...){
     fFlag += 1;
}
if(FailFlag==4)
     //Application->MessageBoxA("备份成功!","消息",MB_OK|MB_ICONINFORMATION);
if(fFlag>0)
     Application->MessageBoxA("执行操作时发生了异常错误,数据库备份没有成功,\n请稍后重试或者联系数据库管理员","错误",MB_OK|MB_ICONSTOP);
ADOQueryBackupTable->Close();
delete ADOQueryBackupTable;
ADOQueryBackupTable = NULL;

}
//---------------------------------------------------------------------------
void __fastcall TfrmClearData::DeleteDir(String dir)
{
char Path[256];
SHFILEOPSTRUCT sfo;
memset(&sfo,0,sizeof(sfo));
memset(Path,0,sizeof(Path));
strcpy(Path,dir.c_str());
sfo.wFunc = FO_DELETE;
sfo.pFrom = Path;
sfo.fFlags = FOF_NOCONFIRMATION;
SHFileOperation(&sfo);
}

#5


starstargao(高顾) 那要是把备份的表还原又怎么处理呀
难道没有sql语句可以实现吗?

#6


应该可以的
查询一下SQL手册

#7


void RestoreDatabase(String FilePath)
{
if(FileExists(FilePath+"\\sys_fee_total.bak"))
     WriteToTable("sys_fee_total",FilePath+"\\sys_fee_total.bak",10);

if(FileExists(FilePath+"\\tran_ls.bak"))
     WriteToTable("tran_ls",FilePath+"\\tran_ls.bak",14);

if(FileExists(FilePath+"\\user_fee.bak"))
     WriteToTable("user_fee",FilePath+"\\user_fee.bak",14);

if(FileExists(FilePath+"\\user_info.bak"))
     WriteToTable("user_info",FilePath+"\\user_info.bak",27);

if(FileExists(FilePath+"\\user_tran.bak"))
     WriteToTable("user_tran",FilePath+"\\user_tran.bak",9);

if(FileExists(FilePath+"\\work_manager.bak"))
     WriteToTable("work_manager",FilePath+"\\work_manager.bak",14);
}
//---------------------------------------------------------------------------
void WriteToTable(String TableName,String DataFilePath,int FieldCount)
{
TADOQuery *RestoreQuery = new TADOQuery(Application);
RestoreQuery->Connection = catvmain->ADOConnection1;
FILE *stream;
char ALineData[10000],*p;
int len =10000,myCount;
String sql;
stream = fopen(DataFilePath.c_str(), "r");
if(stream){
     RestoreQuery->Close();
     RestoreQuery->SQL->Clear();
     RestoreQuery->SQL->Text = "delete from " + TableName;
     RestoreQuery->ExecSQL();
     while(fgets(ALineData, len, stream)){
          myCount = FieldCount;
          sql = "insert into "+TableName +" values(";
          p = strtok(ALineData,"#*#$#*#");
          if(p){
               sql += "'"+AnsiString(p)+"'";
               myCount -= 1;
          }
          while(p){
               p = strtok(NULL,"#*#$#*#");
               if(p && myCount>0){
                    if(AnsiString(p).Trim()=="")
                         sql += ",null";
                    else
                         sql += ",'"+AnsiString(p)+"'";
                    myCount -= 1;
               }
          }
          sql += ")";
          RestoreQuery->Close();
          RestoreQuery->SQL->Clear();
          RestoreQuery->SQL->Text = sql;
          try{
               RestoreQuery->ExecSQL();
          }catch(...){
               continue;
          }
     }
}
fclose(stream);
}

#8


select * into bak from table

#9


如果一定要用bcp的话,这是我曾经用过的办法.
我使用这个方法的平台是WINDOWS 2000+SQL SERVER 2000.
SQL SERVER的登陆方式是WINDOWS认证.
先在TFORM里面放一个TADOQUERY,假设TADOQUERY的名字是ADOQUERY1,里面可以填写SQL语句.
把master数据库里面的表a导出到a.txt的SQL语句:
EXEC master..xp_cmdshell 'bcp master.dbo.a out c:\a.txt -c -S(local) -T'
把a.txt导入到bak数据库里面的表a的SQL语句:
EXEC master..xp_cmdshell 'bcp master.dbo.a in c:\a.txt -c -S(local) -T'
不知道你需不需要用到这些东西,希望对你有帮助.

#10


在SQL 2000中,系统只提供这个数据库的备份,而如果要备份单个表的,要么用SQL语句将表中的记录导入的另一个备份表中,还原时,在从备份表中将记录写入原来的表,就可以了;要么就用系统系统的导入/导出操作,将表的记录导入/导出。我就是这么做的,不过自己写语句方便一些,毕竟一切尽在掌握中嘛!:)

#11


最省事的办法:
用ADOTABLE 连接到要备份的数据表,用ADOTABLE->SaveToFile(filename)将数据备份到指定的文件中,用ADOTABLE->LoadFromFile(filename)将数据恢复

大家出了这么多主意,快散分吧!

#12


gz

#13


To : pqx2002(阿潘) 
你好,你的方法很好,我现在有个问题就是:当我把表备份了,可是当我还原的时候我的数据库中的表的结构已经改变了,也就是我的字段和我备份的表的字段不吻合了,那他还能成功吗,这样的情况我应该怎么办呀,谢谢

#14


如果数据结构改变了,可以先将数据恢复到临时表,再用 insert 语句对齐字段插入了,注意要判断记录是否存在关键字重复。不过老兄,你似乎不用考虑这么多吧,数据结构都改,那你最好做一个独立的恢复工具,用来对齐两个表的字段,同时检测是否主键冲突。