在 SQL Server 中将表从一个数据库复制到另一个数据库
Posted
技术标签:
【中文标题】在 SQL Server 中将表从一个数据库复制到另一个数据库【英文标题】:Copy tables from one database to another in SQL Server 【发布时间】:2010-09-16 07:27:15 【问题描述】:我有一个名为 foo 的数据库和一个名为 bar 的数据库。我在 foo 中有一个名为 tblFoobar 的表,我想将(数据和所有)从数据库 foo 移动到数据库 bar。执行此操作的 SQL 语句是什么?
【问题讨论】:
【参考方案1】:SQL Server Management Studio 的“导入数据”任务(右键单击数据库名称,然后单击任务)将为您完成大部分工作。从您要将数据复制到的数据库中运行它。
如果表不存在,它将为您创建它们,但您可能必须重新创建任何索引等。如果表确实存在,则默认情况下会附加新数据,但您可以调整(编辑映射),以便删除所有现有数据。
我一直在使用它,而且效果很好。
【讨论】:
我似乎找不到这个选项。这里有特定的版本吗? 一般来说,你不能说这是一个更好的答案。例如,从脚本中调用自动化是不可用的。顺便说一句,作者专门要求提供“..SQL 语句..”。但当然这是一个很好的答案,但不是更好的答案;)。 作者要求移动“(data and all)”;所以我希望这个答案能做到这一点。它创建表但不创建任何键或索引;所以对 SQL 答案没有太大的改进。 是否可以使用导入数据任务指定WHERE
条件?我找不到这样做的方法。
是的,这也是here 提到的正确方法,但identity
和foreign key
引用已在目标数据库中删除,有什么解决方案吗?【参考方案2】:
在 SQL Server 上?并在同一数据库服务器上?使用三部分命名。
INSERT INTO bar..tblFoobar( *fieldlist* )
SELECT *fieldlist* FROM foo..tblFoobar
这只是移动数据。如果要移动表定义(以及其他属性,例如权限和索引),则必须执行其他操作。
【讨论】:
我相信您还必须单独设置表权限。 如果您也需要进行身份插入,数据导入向导有一个选项 ^^ - 参考其他答案 @TahaRehmanSiddiqui:因为它回答了问题;)他没有问如何在数据库服务器之间复制它。但是大多数寻找该答案的人最终都在这里,因为谷歌将其作为第一个结果:) @RyanB 是的,这是允许的。 @Tom OP 和许多提出这个问题的人都在寻找“SQL 语句”,而不是工具。【参考方案3】:这应该可行:
SELECT *
INTO DestinationDB..MyDestinationTable
FROM SourceDB..MySourceTable
它不会复制约束、默认值或索引。创建的表将没有有聚集索引。
您也可以:
INSERT INTO DestinationDB..MyDestinationTable
SELECT * FROM SourceDB..MySourceTable
如果您的目标表存在且为空。
【讨论】:
如果先复制基表结构(字段和数据),然后应用patch脚本来创建权限、索引、约束和扩展属性,会有问题吗? 这不会为 SQL Server 2008 中的标识列插入值。仅当您使用列列表并且目标表的 IDENTITY_INSERT 为 ON 时才允许这样做。 @Lucas - 你是“一半”的权利:)。但是,第一个 SQL 语句会复制所有数据,包括标识列中的值。正如我所说,没有创建约束。但是它们可以很容易地在源数据库上编写脚本,并在所有数据移动后应用到目标数据库。 第二个版本 (INSERT INTO...
) 在 Oracle 中为我工作。
如果这两个数据库位于具有不同连接字符串的完全不同的服务器上,这是否有效?如果不是,你如何处理?【参考方案4】:
如果只有一张桌子,那么你需要做的就是
脚本表定义 在另一个数据库中创建新表 更新规则、索引、权限等 导入数据(上面已经展示了几个插入示例)您必须考虑的一件事是其他更新,例如将来迁移其他对象。请注意,您的源表和目标表的名称不同。这意味着如果您依赖对象(例如视图、存储过程等),您还必须进行更改。
您可以手动处理一个或多个对象,而不会出现任何问题。但是,当更新不止一些时,第 3 方比较工具会派上用场。现在我正在使用ApexSQL Diff 进行架构迁移,但使用其他任何工具都不会出错。
【讨论】:
【参考方案5】:在 management studio 中编写 create table
脚本,在 bar 中运行该脚本以创建表。 (在对象资源管理器中右键表,脚本表为,创建到...)
INSERT bar.[schema].table SELECT * FROM foo.[schema].table
【讨论】:
我喜欢这种方法。如果存在标识列,则 Select * 将不起作用,您需要明确列出列名。在这种情况下,您还需要执行SET IDENTITY_INSERT TblName ON
。【参考方案6】:
您还可以使用 Generate SQL Server Scripts Wizard 来帮助指导 SQL 脚本的创建,该脚本可以执行以下操作:
复制表架构 任何约束(身份、默认值等) 表格内的数据 如果需要还有许多其他选项SQL Server 2008 的良好示例工作流,屏幕截图显示here。
【讨论】:
在上面查看我的 cmets:“这是如何获得 508 / 171 票和 Ryan 的“2011 年 10 月 11 日 23:41”答案迄今为止只获得 13 分?!?Ryan 是唯一的 回答那个答案是op的q。完全。因为它处理这些场景(顺便说一句,OP没有从他的q中排除。): a)身份(非常常见),b)约束,c)触发器,d)索引,e)权限,d)复制模式和数据(提示:操作的“和所有”部分"(data and all)" 也暗示了 Schema。) 并且 e) 生成了操作指定的 "SQL 语句",即使他不是字面上的意思,拥有总比没有好。"。 注意:仅当行数不是“过多”(即查找/小型事务表)且没有“大”列值时,此答案才实用。对于那些,我会使用 Ryan 的答案来生成表(包括列属性和子对象)创建的脚本,然后使用 David B 的“插入选择”答案。对于单个表(而不是 Ryan 的 A),您还可以使用 SSMS、对象资源管理器、右键单击表、将表编写为、创建到,但您必须首先确保工具、选项、SQL Server 对象资源管理器、脚本选项是根据需要设置。【参考方案7】:你可以这样走:(一个一般的例子)
insert into QualityAssuranceDB.dbo.Customers (columnA, ColumnB)
Select columnA, columnB from DeveloperDB.dbo.Customers
另外,如果您还需要生成列名以放入插入子句,请使用:
select (name + ',') as TableColumns from sys.columns
where object_id = object_id('YourTableName')
复制结果并粘贴到查询窗口中以表示您的表列名称,即使这也会排除标识列:
select (name + ',') as TableColumns from sys.columns
where object_id = object_id('YourTableName') and is_identity = 0
请记住,如果数据库属于同一位置,则复制行的脚本将起作用。
你可以试试这个。
select * into <Destination_table> from <Servername>.<DatabaseName>.dbo.<sourceTable>
如果两个数据库位于同一服务器中,则服务器名称是可选的。
【讨论】:
【参考方案8】:我给你三个选择:
如果它们是同一实例上的两个数据库,请执行以下操作:
SELECT * INTO My_New_Table FROM [HumanResources].[Department];
如果它们是不同服务器上的两个数据库,并且您有链接服务器,请这样做:
SELECT * INTO My_New_Table FROM [ServerName].[AdventureWorks2012].[HumanResources].[Department];
如果它们是不同服务器上的两个数据库并且您没有链接服务器:
SELECT * INTO My_New_Table
FROM OPENROWSET('SQLNCLI', 'Server=My_Remote_Server;Trusted_Connection=yes;',
'SELECT * FROM AdventureWorks2012.HumanResources.Department');
【讨论】:
以上是关于在 SQL Server 中将表从一个数据库复制到另一个数据库的主要内容,如果未能解决你的问题,请参考以下文章
将表从 SQL Server 2008 复制到 MS Access 2007
如何使用 phpMyAdmin 将表从 SERVER 1 上的数据库复制到 SERVER 2 上的另一个数据库?