- Вопрос или проблема
- Ответ или решение
- Решение проблемы с преобразованием параметров сервера и БД в проекте SQL DACPack с использованием Azure DevOps
- Определение проблемы
- Решения
- 1. Проверьте переменную в DevOps
- 2. Измените синтаксис использования SQLCMD
- 3. Проверьте конфигурацию хранимой процедуры
- 4. Локализация ошибки
- Заключение
Вопрос или проблема
У меня есть проект SQL DB, созданный в VS 2022. В нем есть хранимая процедура, и я параметризовал сервер и базу данных, так как она подключается к другому серверу с помощью связанного сервера. Я создал сборку в Azure DevOps и выпустил из нее с параметром, который я использовал в этих хранимых процедурах. Когда я развертываю dacpac в Azure DevOps, он преобразует эту переменную, но добавляет лишнюю скобку.
Я определил $(UserServerAndDB) как переменную SQLCMD в моем проекте базы данных. Моя хранимая процедура 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 я собрал проект базы данных, и у меня есть dacpac в артефактах. Я создал конвейер выпуска из этого артефакта и там я использовал Задачу развертывания базы данных SQL Server для развертывания моего Dacpack. Это работает отлично. Однако моя переменная, которую я создал в конвейере выпуска, называется 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
Ответ или решение
Решение проблемы с преобразованием параметров сервера и БД в проекте SQL DACPack с использованием Azure DevOps
Ваша проблема с добавлением лишней скобки при преобразовании параметра UserServerAndDB
в проекте SQL на платформе Azure DevOps вызвана неправильным синтаксисом при формировании строки подключения к базе данных. Рассмотрим более подробно, как можно исправить это, чтобы ваш DACPack развертывался правильно.
Определение проблемы
Судя по вашему описанию, вы создали хранимую процедуру, которая использует параметризованное имя сервера и базы данных:
CREATE PROCEDURE [dbo].[USP_GetUser]
@userId nvarchar(16)
AS
BEGIN
SELECT UserId, UserName
FROM [$(UserServerAndDB)].[dbo].[User]
WHERE UserId = @userId;
END
При трансформации переменной UserServerAndDB
в Azure DevOps вы указываете в параметрах задачи SQL Server database deploy
:
/v:UserServerAndDB=$(UserServerAndDB)
Однако, вместо ожидаемого результата:
FROM [USER_D_LK].[dbo].[User]
вы получаете:
FROM [USER_D_LK].[User]][dbo].[User]
Это происходит из-за того, что Azure DevOps неправильно интерпретирует значение переменной, добавляя лишнюю закрывающую скобку.
Решения
1. Проверьте переменную в DevOps
Убедитесь, что значение переменной UserServerAndDB
в вашем Azure DevOps Pipeline не включает лишние скобки или пробелы. Вы можете отобразить значение переменной в логах для контроля:
echo $(UserServerAndDB)
2. Измените синтаксис использования SQLCMD
Убедитесь, что вами правильно используется синтаксис SQLCMD. Иногда, если вы указываете значения с лишними пробелами или кавычками, это может вызывать подобные проблемы. Например, попробуйте изменить
/v:UserServerAndDB="$(UserServerAndDB)"
вместо:
/v:UserServerAndDB=$(UserServerAndDB)
3. Проверьте конфигурацию хранимой процедуры
Также следует проверить, как вы определяете свою переменную UserServerAndDB
внутри самого SQL проекта. Убедитесь, что она объявлена только один раз и не имеет лишних скобок в контексте использования.
4. Локализация ошибки
Если проблема сохраняется, попробуйте создать отдельный тестовый проект SQL с упрощенной версией вашей процедуры и ее вызова. Это поможет изолировать проблему и выявить, возникает ли она из-за конкретных настроек или конфигураций.
Заключение
Надеюсь, эти рекомендации помогут вам устранить проблему с лишними скобками при использовании параметров в Azure DevOps. Важно внимательно следить за синтаксисом и конфигурациями ваших параметров, так как это основа успешного выполнения развертывания. Если проблема останется, рекомендую обратиться на специализированные форумы или в службу поддержки, где можно будет более детально ознакомиться с вашей конфигурацией и идентифицировать возможные несовпадения.