【问题标题】:SQL Azure - copy table between databasesSQL Azure - 在数据库之间复制表
【发布时间】:2020-07-31 21:35:21
【问题描述】:

我正在尝试运行以下 SQL:

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

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

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

【问题讨论】:

    标签: sql azure azure-sql-database


    【解决方案1】:

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

    使用SQL Management Studio R2 SP1连接azure,我右键源数据库,选择generate scripts。

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

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

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

    完成,数据已迁移。

    希望对某人有所帮助

    【讨论】:

    • 如果您只是想复制 DATA。那么这就是正确的答案。
    • 在 32 票赞成之后,很遗憾这没有被接受为答案
    • 谢谢!在我的情况下,我需要进行时间点恢复,删除所有我不想要的数据,然后按照您的说明获取脚本以应用于原始数据。
    • 除非我理解错了,否则这种方法要求数据足够小,以便将其全部存储在一个脚本中并复制粘贴它是可行的。这不就是另一种下载到客户端再上传到目标数据库的方式吗?
    • 正确。正如我在评论开头所说的“一次性的手动解决方案”。我知道它并不完美,但它解决了我当时的问题。
    【解决方案2】:

    自 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
    

    【讨论】:

    • 感谢这个方法。在 Azure 上使用数据库时非常有效。
    • 试过了,但我只是在 'DATA_SOURCE' 附近得到不正确的语法 - 尝试添加一个 ;但同样的信息
    • @james5 为了帮助您,我需要查看更多您的代码,也许您创建了一个新的 stackoverflow 问题。
    • 这段代码不完整:甚至没有定义 target_table。
    • @SUMguy 仅删除所有主键和其他约束 WITH 和 DATA_SOURCE 参数
    【解决方案3】:

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

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

    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

    【讨论】:

    • 仅当表格小于 500 MB 时同步才有效!
    【解决方案4】:

    SQL-Azure 不支持 USE 语句并且实际上不支持跨数据库查询。所以上面的查询必然会失败。

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

    【讨论】:

    • 谢谢,但我需要将一张表从一个数据库复制到另一个数据库。有什么提示吗?
    • 您是否需要定期执行一次,例如每晚或按需执行一次?
    • 嗯,这是大“工作”的一部分——我将表结构与其他数据库进行比较并进行相应调整,这里需要将数据从备份数据库复制到新数据库
    • 好的,听起来像是 SQL Azure Sync(目前在 CTP 中)的一个案例。您可以使用 Sync 在 sql azure 数据库之间配置与代码无关的同步关系。更多详情请参阅 Sync Framework 团队博客blogs.msdn.com/b/sync/archive/2011/03/08/…
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

        Step1 : 在 [AlexDB] 中创建另一个与 Suppliers 表结构相同的表,将其命名为 SuppliersBackup

        Step2 : 在 DesiredDB 中创建与 Suppliers 表结构相同的表

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

        第 4 步:从 AlexDB..Suppliers 中截断数据

        Step5 : 将数据从 AlexDB..SuppliersBackup 复制到 AlexDB..Suppliers

        第 6 步:现在运行同步

        数据已复制到 DesiredDB。

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              【解决方案10】:

              您可以从 SQL Management Studio 轻松添加“链接服务器”,然后查询完全限定的表名。不需要平面文件或导出表。此方法也适用于本地到 azure 数据库,反之亦然。

              例如

              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
              

              【讨论】:

                【解决方案11】:

                一些选项(相当解决方法):

                1. 用数据生成脚本
                2. 在 Azure 中使用数据同步
                3. 使用 MS Access(导入然后导出),有许多排除项(例如 Access 中没有 GUID)
                4. 使用 Red Gate 等 3 方工具。

                不幸的是,到目前为止还没有简单的内置方法可以做到这一点。

                【讨论】:

                  【解决方案12】:

                  我会推荐 SSMS SQL Server 导入和导出功能。此功能支持多个连接配置和选定表的跨服务器副本。我试过 .NET Sql Server 连接器,它非常适用于 Azure SQL 数据库。

                  【讨论】:

                    猜你喜欢
                    • 2022-08-03
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多