|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
这能找出所有错误的99.99%。它不能找出的是仅仅涉及数据文件的损坏(这很不常见)。如果你想要检查一张表,你通常应该没有选项地运行myisamchk或用-s或--silent选项的任何一个。由于事情中常常必要将数据从一个数据库导进到另外一个数据库中,以是将这个功效写成一个存储历程,以便利挪用。如今粘贴出来供人人参考:
注重:
1,以下示例顶用到了syscolumns,sysobjects等体系视图,在sql2005及今后的版本中,人人也能够利用sys.columns与sys.objects来取代,只需修正对应的字段便可。
2,以下示例还用到了setidentity_insert设置,有对该设置不太分明的伴侣能够点击链接检察其用法。
3,分离sys.tables表与游标,人人能够轮回挪用以下存储历程以完成将一个数据库中一切的表的数据导进到另外一个数据库中。
setANSI_NULLSON
setQUOTED_IDENTIFIERON
go
createPROCEDURE[dbo].[Usp_Sys_ImportData]@SourceDBNamevarchar(128),@TargetDBNamevarchar(128),@TableNamevarchar(128)AS
/*
存储历程称号:Usp_Sys_ImportData
功效简述:历来源数据库导进指定表数据到方针数据库
相干工具:
参数:@SourceDBNamevarchar(128)来历数据库称号
@TargetDBNamevarchar(128)方针数据库称号
@TableNamevarchar(128)表名
*/
SETNOCOUNTON;
declare@TempSqlvarchar(max)
--取来历表栏位(不包含盘算列)
declare@T_SourceColumnTable(ColumnIDintnotnull,ColumnNamevarchar(128)notnull)
select@TempSql=selectt1.colid,t1.name
+char(10)+from+@SourceDBName+..syscolumnst1
+char(10)+join+@SourceDBName+..sysobjectst2ont2.id=t1.id
+char(10)+wheret2.name=+@TableName+
+char(10)+ andt1.iscomputed=0
+char(10)+orderbyt1.colid
insertinto@T_SourceColumn(ColumnID,ColumnName)
exec(@TempSql)
--取方针表栏位(不包含盘算列)
declare@T_TargetColumnTable(ColumnIDintnotnull,ColumnNamevarchar(128)notnull)
select@TempSql=selectt1.colid,t1.name
+char(10)+from+@TargetDBName+..syscolumnst1
+char(10)+join+@TargetDBName+..sysobjectst2ont2.id=t1.id
+char(10)+wheret2.name=+@TableName+
+char(10)+ andt1.iscomputed=0
+char(10)+orderbyt1.colid
insertinto@T_TargetColumn(ColumnID,ColumnName)
exec(@TempSql)
--反省是不是有自增列
declare@T_TargetIdentityColumnTable(ColumnIDintnotnull,ColumnNamevarchar(128)notnull)
select@TempSql=selectt1.colid,t1.name
+char(10)+from+@TargetDBName+..syscolumnst1
+char(10)+join+@TargetDBName+..sysobjectst2ont2.id=t1.id
+char(10)+wheret2.name=+@TableName+
+char(10)+ andt1.colstat=1
+char(10)+orderbyt1.colid
insertinto@T_TargetIdentityColumn(ColumnID,ColumnName)
exec(@TempSql)
declare@HasIdentityColumnint
ifexists(select*from@T_TargetIdentityColumn)
begin
select@HasIdentityColumn=1
end
else
begin
select@HasIdentityColumn=0
end
--取要导进的栏位(配合的栏位)
declare@ColumnListvarchar(max)
select@ColumnList=
select@ColumnList=@ColumnList+,+t1.ColumnName
from@T_SourceColumnt1,
@T_TargetColumnt2
wheret1.ColumnName=t2.ColumnName
orderbyt1.ColumnID
ifleft(@ColumnList,1)=,
begin
select@ColumnList=substring(@ColumnList,2,len(@ColumnList)-1)
end
if@ColumnList
begin
--机关导进数据的SQL
declare@ExecSqlvarchar(max)
select@ExecSql=altertable+@TargetDBName+..+@TableName+disabletriggerall
+char(10)+deletefrom+@TargetDBName+..+@TableName
if@HasIdentityColumn=1
begin
select@ExecSql=@ExecSql+char(10)+setidentity_insert+@TargetDBName+..+@TableName+on
end
select@ExecSql=@ExecSql+char(10)+insertinto+@TargetDBName+..+@TableName+(+@ColumnList+)
+char(10)+select+@ColumnList+from+@SourceDBName+..+@TableName
if@HasIdentityColumn=1
begin
select@ExecSql=@ExecSql+char(10)+setidentity_insert+@TargetDBName+..+@TableName+off
end
select@ExecSql=@ExecSql+char(10)+altertable+@TargetDBName+..+@TableName+enabletriggerall
print@ExecSql
--实行导进
exec(@ExecSql)
if@@error=0
begin
return1
end
else
begin
return-1
end
end
else
begin
return1
end
恢复到之前的某个状态,是需要数据的。这数据可以是a)回滚步骤或者b)操作之前的数据状态原文。 |
|