仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 972|回复: 8
打印 上一主题 下一主题

[学习教程] 使用Sql完成将指定表数据导进到另外一个数据库示例

[复制链接]
不帅 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:07:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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)操作之前的数据状态原文。
海妖 该用户已被删除
沙发
发表于 2015-1-18 12:02:33 | 只看该作者
比如日志传送、比如集群。。。
柔情似水 该用户已被删除
板凳
发表于 2015-1-24 13:19:10 来自手机 | 只看该作者
光写几个SQL实在叫无知。
蒙在股里 该用户已被删除
地板
发表于 2015-2-1 16:21:08 | 只看该作者
换言之,只有在不断的失败中尝试成功,而关于失败的总结却是很少的
admin 该用户已被删除
5#
发表于 2015-2-7 09:51:14 | 只看该作者
如果是将来做数据库的开发设计,就应该详细学习T-SQL的各种细节,包括T-SQL的程序设计、存储过程、触发器以及具体使用某个开发语言来访问数据库。
只想知道 该用户已被删除
6#
发表于 2015-2-21 19:11:55 | 只看该作者
记得在最开始使用2k的时候就要用到这个功能,可惜2k没有,现在有了作解决方案的朋友会很高兴吧。
变相怪杰 该用户已被删除
7#
发表于 2015-3-6 21:38:21 | 只看该作者
我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力
谁可相欹 该用户已被删除
8#
发表于 2015-3-13 22:08:52 | 只看该作者
至于淘汰的问题,只能说在你的项目周期之内,微软应该都不会倒闭。
简单生活 该用户已被删除
9#
发表于 2015-3-20 21:07:42 | 只看该作者
我是一个ERP初学者,对于前台运用基本熟悉,但对于后台SQLServer的运用一点也不懂,特想学习下相关资料。至少懂得一些基本的运用。希望各位能给于建议,小弟再谢过!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 23:16

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表