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

问题描述 投票: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 数据库部署 任务来部署我的 Dacpac。 效果很好。但是,我在发布管道中创建的变量名为 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个回答
1
投票

我在本地计算机上的 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
    

编辑:

您可以在 SQL 脚本中尝试“

IF...ELSE
”语句。

例如。

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

使用条件“

$(ServerName)' = 'xxxx
”来比较服务器,'
xxxx
'应该是当前运行脚本的服务器:

  • 如果在同一服务器上,请设置“
    FROM [$(DBName)].[dbo].[User]
    ”。
  • 如果不在同一服务器,请设置“
    FROM [$(ServerName)].[$(DBName)].[dbo].[User]
    ”。

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