我正在尝试自动初始化 Azure 上的 SQL 数据库。对于某些(查找)表,每次初始化时都需要将数据从源数据库复制到新数据库中。
为此,我执行一个包含以下内容的查询
SELECT * INTO [target_db_name]..[my_table_name] FROM [source_db_name].dbo.[my_table_name]
此时抛出一个异常,告诉我
Reference to database and/or server name in 'source_db_name.dbo.my_table_name' is not supported in this version of SQL Server.
经过研究,我发现现在可以引用另一个 Azure SQL DB,只要它已配置为外部数据源。 [here和 here ]
因此,在我的目标数据库中,我执行了以下语句:
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'
)
但是 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]
我发现我确实应该查询
SELECT * FROM [my_table_name]
最佳答案
看起来您可能需要定义外部表 according to what appears to be the correct syntax :
CREATE EXTERNAL TABLE [dbo].[source_table](
...
)
WITH
(
DATA_SOURCE = source_db_name
);
The three part name approach is unsupported, except through elastic database query.
现在,由于您正在创建外部表,因此查询可以假设外部表是我们的 [target_db] 的 native 对象 - 这允许您编写查询SELECT * FROM [my_table_name]
,正如您从编辑中发现的那样。从文档中,值得注意的是“这允许对远程数据库进行只读查询”。因此,该表对象不可写,但您的问题仅提到从中读取以填充新表。
关于sql - 将 "SELECT INTO"与 Azure SQL 结合使用从另一个数据库复制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39209534/