SQL Azure - 在数据库之间复制表

时间:2011-07-04 14:25:58

标签: sql azure azure-sql-database

我正在尝试运行以下SQL:

INSERT INTO Suppliers ( [SupplierID], [CompanyName]) 
Select  [SupplierID], [CompanyName] From [AlexDB]..Suppliers

并收到错误“此版本的sql server不支持对数据库和/或服务器名称的引用”

知道如何在服务器“内部”的数据库之间复制数据吗? 我可以将数据加载到客户端然后再回到服务器,但这非常慢。

11 个答案:

答案 0 :(得分:60)

我知道这已经过时了,但我还有另一种手动解决方案。

使用SQL Management Studio R2 SP1连接到azure,我右键单击源数据库并选择生成脚本。

在向导中,在我选择了表格后,我选择了要输出到查询窗口,然后单击高级。大约在属性窗口的一半 “脚本数据类型”有一个选项。我选择并将其更改为“仅数据”,然后我完成向导。

我所做的就是检查脚本,重新排列插入的约束,并更改顶部的使用以针对我的目标数据库运行它。

然后我右键单击目标数据库并选择新查询,将脚本复制到其中,然后运行它。

完成,迁移数据。

希望能帮到某人

答案 1 :(得分:14)

自2015年起,可以使用elastic database queries(也称为cross database queries)来完成此操作。

我创建并使用了这个模板,它在20分钟内复制了150万行:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

CREATE DATABASE SCOPED CREDENTIAL SQL_Credential  
WITH IDENTITY = '<username>',
SECRET = '<password>';

CREATE EXTERNAL DATA SOURCE RemoteReferenceData
WITH
(
    TYPE=RDBMS,
    LOCATION='<server>.database.windows.net',
    DATABASE_NAME='<db>',
    CREDENTIAL= SQL_Credential
);

CREATE EXTERNAL TABLE [dbo].[source_table] (
    [Id] BIGINT NOT NULL,
    ...
)
WITH
(
    DATA_SOURCE = RemoteReferenceData
)

SELECT *
 INTO target_table
FROM source_table

答案 2 :(得分:7)

不幸的是,在单个查询中无法执行此操作。

实现它的最简单方法是使用“数据同步”来复制表格。这样做的好处是它也可以在服务器之间工作,并使您的表保持同步。

http://azure.microsoft.com/en-us/documentation/articles/sql-database-get-started-sql-data-sync/

在实践中,我没有那种在生产中运行“数据同步”的经验,但它对于一次性工作很好。

“数据同步”的一个问题是它会在您的数据库中创建大量“同步”对象,并且从Azure门户中删除实际的“数据同步”可能会也可能不会清除它们。按照本文中的说明手动清除所有内容:

https://msgooroo.com/GoorooTHINK/Article/15141/Removing-SQL-Azure-Sync-objects-manually/5215

答案 3 :(得分:3)

SQL-Azure不支持USE语句,实际上不支持跨数据库查询。所以上面的查询一定会失败。

如果要将数据库复制/备份到另一个sql azure db,可以在SQL-Azure中使用“Same-server”复制或“跨服务器”复制。 Refer this msdn article

答案 4 :(得分:3)

您可以使用Red Gate Software中的SQL Data Compare工具,它可以将数据库内容从一个地方移动到另一个地方,并完全支持SQL Azure。 14天免费试用应该让你看看它是否可以做你需要的。

完全披露:我为Red Gate Software工作

答案 5 :(得分:3)

使用以下步骤,没有直接的方法可以这样做。但通过一些技巧,我们可以。

步骤1:在[AlexDB]中创建另一个具有相同Structure表结构的表,将其称为SuppliersBackup

步骤2:在DesiredDB中创建与Suppliers表相同结构的表

步骤3:在AlexDB..Suppliers和DesiredDB..Suppliers之间启用数据同步

步骤4:截断来自AlexDB..Suppliers的数据

步骤5:将数据从AlexDB..SuppliersBackup复制到AlexDB..Suppliers

步骤6:现在运行同步

数据已复制到DesiredDB。

答案 6 :(得分:2)

旧帖子,但另一个选项是Sql Azure Migration wizard

答案 7 :(得分:2)

如果您的onprem版本具有sp_addlinkedsrvlogin,则可以为源数据库和目标数据库设置链接服务器,然后您可以运行插入查询。

请参阅此博客中的“针对Windows Azure SQL数据库的链接服务器和分布式查询的SQL Server支持”:https://azure.microsoft.com/en-us/blog/announcing-updates-to-windows-azure-sql-database/

答案 8 :(得分:1)

好吧,我想我找到了答案 - 没办法。必须将数据移动到客户端,或做一些其他技巧。这是指向文章的链接,其中包含解释:Limitations of SQL Azure: only one DB per connection 但欢迎任何其他想法!

答案 9 :(得分:0)

一些选项(而不是解决方法):

  1. 使用数据生成脚本
  2. 在Azure中使用数据同步
  3. 使用MS Access(导入然后导出),包含许多排除项(例如Access中没有GUID)
  4. 使用红门等第三方工具。
  5. 不幸的是,到目前为止还没有简单易用的内置方式。

答案 10 :(得分:0)

您可以轻松地从SQL Management Studio添加“链接服务器”,然后查询标准表名。不需要平面文件或导出表。此方法还适用于本地化数据库的天蓝色,反之亦然。

例如

select top 1 ColA, ColB from [AZURE01_<hidden>].<hidden>_UAT_RecoveryTestSrc.dbo.FooTable order by 1 desc

select top 1 ColA, ColB from [AZURE01_<hidden>].<hidden>_UAT_RecoveryTestTgt.dbo.FooTable order by 1 desc

Management Studio Screenshot