Сценарий проекта базы данных SQL Server до и после развертывания


Я добавил дополнительный столбец в таблицу,которую я хочу инициализировать с помощью запроса в сценарии post deployment. К сожалению, я не могу написать запрос, который можно запускать каждый раз, поэтому я ищу способ проверить в сценарии перед развертыванием, если столбец доступен, и передать аргумент или переменную в сценарий после развертывания, который затем выполнит запрос инициализации один раз.

Попытка 1: я попытался установить sqlcmd var в сценарии перед развертыванием, но следующий синтаксис не допускается:

IF COL_LENGTH('dbo.Table','NewColumn') IS NULL
    :setvar PerformInitQuery 1

Попытка 2: я также пытался использовать обычную переменную в скрипте перед развертыванием:

DECLARE @PerformInitQuery BIT = 0
IF COL_LENGTH('dbo.Table','NewColumn') IS NULL
    SET @PerformInitQuery = 1

И доступ к нему в сценарии после развертывания:

IF @PerformInitQuery = 1
BEGIN
    :r ".DeploymentScriptsPerformInitQuery.sql"
END
Эта последняя попытка, по-видимому, сработала при публикации проекта из Visual Studio, но не на нашем сервере сборки; который использует SqlPackage.exe для публикации сгенерированного файла .dacpac в базу данных.

Ошибка SQL72014: поставщик данных .Net SqlClient:

Msg 137, Уровень 15, Состояние 2, Строка 12
Необходимо объявить скалярную переменную "@PerformInitQuery "

1 3

1 ответ:

Вы можете попробовать использовать временную таблицу для хранения значений, которые вы хотите передать из скриптов pre в post;

/*
     Pre-Deployment Script Template                         
    --------------------------------------------------------------------------------------
     This file contains SQL statements that will be executed before the build script.   
     Use SQLCMD syntax to include a file in the pre-deployment script.          
     Example:      :r .\myfile.sql                              
     Use SQLCMD syntax to reference a variable in the pre-deployment script.        
     Example:      :setvar TableName MyTable                            
                   SELECT * FROM [$(TableName)]                 
    --------------------------------------------------------------------------------------
    */

    select 'hello world' as [Col] into #temptable

Подобран в сценарии после развертывания;

/*
Post-Deployment Script Template                         
--------------------------------------------------------------------------------------
 This file contains SQL statements that will be appended to the build script.       
 Use SQLCMD syntax to include a file in the post-deployment script.         
 Example:      :r .\myfile.sql                              
 Use SQLCMD syntax to reference a variable in the post-deployment script.       
 Example:      :setvar TableName MyTable                            
               SELECT * FROM [$(TableName)]                 
--------------------------------------------------------------------------------------
*/

declare @var nvarchar(200)
select @var = [Col] from #temptable

print @var

Привет, мир

Обновление завершено.