使用“SELECT INTO”和 Azure SQL 从另一个数据库复制数据

awj*_*awj 6 sql azure azure-sql-database

我正在尝试在 Azure 上自动初始化 SQL DB。对于某些(查找)表,每次初始化时都需要将数据从源 DB 复制到新 DB 中。

为此,我执行一个查询,其中包含

SELECT * INTO [target_db_name]..[my_table_name] FROM [source_db_name].dbo.[my_table_name]
Run Code Online (Sandbox Code Playgroud)

此时抛出一个异常告诉我

此版本的 SQL Server 不支持在“source_db_name.dbo.my_table_name”中引用数据库和/或服务器名称。

对此进行研究后,我发现现在可以引用另一个 Azure SQL DB,前提是它已配置为外部数据源。[这里这里]

因此,在我的目标数据库中,我执行了以下语句:

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

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

CREATE EXTERNAL DATA SOURCE [source_db_name]
WITH
(
    TYPE=RDBMS,
    LOCATION='my_location.database.windows.net',
    DATABASE_NAME='source_db_name',
    CREDENTIAL= cred
);

CREATE EXTERNAL TABLE [dbo].[my_table_name](
    [my_column_name] BIGINT NOT NULL
)
WITH
(
    DATA_SOURCE = [source_db_name],
    SCHEMA_NAME = 'dbo',
    OBJECT_NAME = 'my_table_name'
)
Run Code Online (Sandbox Code Playgroud)

但是该SELECT INTO语句仍然产生相同的异常。

此外,一个简单的SELECT * FROM [source_db_name].[my_table_name]产生异常“无效的对象名称'source_db_name.my_table_name'”。

我错过了什么?

更新
我发现了问题:在目标数据库中CREATE EXTERNAL TABLE创建一个表。要对此进行查询,不应使用源数据库名称。所以我失败的地方:

SELECT * FROM [source_db_name].[my_table_name]
Run Code Online (Sandbox Code Playgroud)

我明白我真的应该查询

SELECT * FROM [my_table_name]
Run Code Online (Sandbox Code Playgroud)

Dan*_*ske 3

看起来您可能需要根据正确的语法来定义该外部表:

CREATE EXTERNAL TABLE [dbo].[source_table](
...
)
WITH
(
DATA_SOURCE = source_db_name
);
Run Code Online (Sandbox Code Playgroud)

不支持三部分名称方法,除非通过弹性数据库查询。

现在,由于您正在创建一个外部表,因此查询可以假装外部表是我们的 [target_db] 的本机对象 - 这允许您编写查询SELECT * FROM [my_table_name],正如您从编辑中发现的那样。从文档中,值得注意的是“这允许对远程数据库进行只读查询”。因此,该表对象不可写,但您的问题仅提到从中读取以填充新表。