使用 Azure Devops 发布管道转换数据库项目 Dacpack 中的服务器和数据库名称参数时出现问题(产生额外的括号)

问题描述 投票:0回答:1

我在 VS 2022 中创建了 sql DB 项目,在那里我有一个存储过程,并且我参数化了服务器和数据库,因为它使用链接服务器连接到不同的服务器。我在 Azure DevOps 中创建了一个构建,并使用我在存储过程中使用的参数创建了一个版本。当我在 azure devops 中部署 dacpack 时,它会转换此变量,但会添加额外的括号。

我在我的数据库项目中定义了 $(UserServerAndDB) 是 SQLCMD 变量。我的sp USP_GetUser.sql 在数据库项目中看起来像这样

CREATE PROCEDURE [dbo].[USP_GetUser]
    @userId nvarchar(16)
AS
BEGIN
    SELECT UserId, UserName
    FROM [$(UserServerAndDB)].[dbo].[User]
    WHERE UserId = @userId;
END

现在在 azure devops 中,我构建了 db 项目,并且在工件中拥有 dacpack。我从该工件创建了发布管道,并在其中使用 SQL Server 数据库部署 任务来部署我的 Dacpack。 效果很好。但是,我在发布管道中创建的名为 UserServerAndDB 的变量,其值为 USER_D_LK]。[User 未正确转换。我将其作为附加参数添加到此任务 /v:UserServerAndDB=$(UserServerAndDB) 到SQL Server数据库部署任务参见下面

enter image description here

但是当它完成数据库部署时

相反

CREATE PROCEDURE [dbo].[USP_GetUser]
    @userId nvarchar(16)
AS
BEGIN
    SELECT UserId, UserName
    FROM [USER_D_LK].[User].[dbo].[User]
    WHERE UserId = @userId;
END

任何帮助将不胜感激!

它创建以下内容并添加 2 个括号。很奇怪这个额外的括号是从哪里来的

CREATE PROCEDURE [dbo].[USP_GetUser]
    @userId nvarchar(16)
AS
BEGIN
    SELECT UserId, UserName
    FROM [USER_D_LK].[User]].[dbo].[User]
    WHERE UserId = @userId;
END
sql-server azure-pipelines azure-pipelines-release-pipeline dacpac
1个回答
0
投票

我在本地计算机上的 Visual Studio 2022 中创建了一个具有类似变量和 SQL 脚本的 SQL DB 项目,然后在 Visual Studio 中运行

publish
任务。我可以重现同样的问题,它有额外的括号“
]
”。

看起来,问题在于仅使用一个变量传递服务器名称和数据库名称的方式。

要解决此问题,您可以尝试如下:

  1. 定义两个变量,一个用于服务器名称 (

    $(ServerName)
    ),另一个用于 SQL DB 项目中的数据库名称 (
    $(DBName)
    )。

    enter image description here

  2. 更改 SQL 脚本如下。

    CREATE PROCEDURE [dbo].[USP_GetUser]
        @userId nvarchar(16)
    AS
    BEGIN
        SELECT UserId, UserName
        FROM [$(ServerName)].[$(DBName)].[dbo].[User]
        WHERE UserId = @userId;
    END
    

© www.soinside.com 2019 - 2024. All rights reserved.