此版本的 SQL Server 不支持对数据库和/或服务器名称的引用

Mic*_*ack 5 sql sql-server azure-sql-database

客观的

我正在尝试使用类似于以下的脚本将来自几个不同 Azure 数据库的数据放入一个新的 Azure 数据库中:

:setvar db1 [dbSource1]
:setvar db2 [dbSource2]
:setvar dbTarget "myNewDatabase"

USE master;
GO

DROP DATABASE IF EXISTS $(dbTarget)
GO

CREATE DATABASE $(dbTarget)
GO

CREATE TABLE $(dbTarget).[dbo].[Tenants](
    [TenantId] [nvarchar](450) NOT NULL,
    [OwnerObjectId] [nvarchar](max) NOT NULL,
    [NetworkId] [nvarchar](450) NOT NULL,
    [EndorserType] [int] NOT NULL,
    [Active] [bit] NOT NULL DEFAULT 1,
    [Region] [nvarchar](450) NOT NULL DEFAULT 'us-central',
 CONSTRAINT [PK_Tenants] PRIMARY KEY CLUSTERED 
(
    [TenantId] ASC
)

CREATE TABLE $(dbTarget).[dbo].[ProductPlan](
    [ProductPlanId] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](max) NULL,
    [Description] [nvarchar](max) NULL,
    [IsStandard] [bit] NOT NULL,
    [StripePlanId] [nvarchar](max) NULL,
    [IsYearly] [bit] NOT NULL,
 CONSTRAINT [PK_ProductPlan] PRIMARY KEY CLUSTERED 
(
    [ProductPlanId] ASC
)

INSERT INTO $(dbTarget).[dbo].[Tenants] (TenantId, OwnerObjectId, NetworkId, EndorserType) 
    SELECT TenantId, OwnerObjectId, NetworkId, EndorserType FROM $(db1).[domain].[Tenants]

INSERT INTO $(dbTarget).[dbo].[ProductPlan] (ProductPlanId, Name, Description, IsStandard, StripePlanId, IsYearly)
    SELECT ProductPlanId, Name, Description, IsStandard, StripePlanId, IsYearly FROM $(db2).[dbo].[ProductPlan]
Run Code Online (Sandbox Code Playgroud)

本质上,我在新数据库中创建表,其模式与源数据库中的模式完全相同,然后尝试将这些源表中的所有数据插入到目标表中。

注意:这在本地数据库上工作正常,但在我的 Azure SQL Server 中的数据库上失败

问题

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

所以脚本创建了新数据库就好了,但是一旦它试图在该数据库中创建一个表,它就会吐出上面的错误。USE myNewDatabase在创建数据库之后和创建第一个表之前尝试通过插入来切换上下文会引发另一个错误:USE statement is not supported to switch between databases. Use a new connection to connect to a different database.

尝试的解决方案

我试过像第二个错误状态那样建立新的连接,但似乎无法连接到特定的数据库。我总是最终连接到 master,然后再次出现第一个错误。

关于我需要做什么才能完成这项工作的任何想法?先谢谢了!

Leo*_*Yue 8

在 Azure SQL 数据库中,要创建数据库,登录名必须是以下之一:

  • 服务器级主体登录
  • 本地 Azure SQL Server 的 Azure AD 管理员
  • 作为 dbmanager 数据库角色成员的登录名

如果您有权限,您可以在每个数据库中运行创建数据库,例如在主数据库或用户数据库中。

但是Azure SQL数据库不支持USE数据库或直接跨数据库操作,即使这些数据库位于同一个Azure SQL Server中。

Azure SQL数据库仅支持弹性查询的跨数据库查询。那还是需要很多步骤才能实现跨查询。不支持跨数据库建表。我们必须在其他数据库上创建一个新的连接(查询会话)。

目前,它不受支持,我们无法使其工作。

有关更多详细信息,请参阅:Azure SQL 数据库不支持 Transact-SQL 语法