我在 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 数据库部署 任务,请参见下文
但是当它完成数据库部署时
相反
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
我在本地计算机上的 Visual Studio 2022 中创建了一个具有类似变量和 SQL 脚本的 SQL DB 项目,然后在 Visual Studio 中运行
publish
任务。我可以重现同样的问题,它有额外的括号“]
”。
看起来,问题在于仅使用一个变量传递服务器名称和数据库名称的方式。
要解决此问题,您可以执行以下操作:
定义两个变量,一个用于服务器名称 (
$(ServerName)
),另一个用于 SQL DB 项目中的数据库名称 ($(DBName)
)。
更改 SQL 脚本如下。
CREATE PROCEDURE [dbo].[USP_GetUser]
@userId nvarchar(16)
AS
BEGIN
SELECT UserId, UserName
FROM [$(ServerName)].[$(DBName)].[dbo].[User]
WHERE UserId = @userId;
END
编辑:
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]
”。