:SETVAR ScriptNameId ".\PostScripts\PathToScript\ScriptNameHere"
GO
IF NOT EXISTS ( SELECT *
FROM dbo.ScriptsHistoryTableWithVeryNiceName
WHERE Script_Name_Id = '$(ScriptNameId)' AND database_name = DB_NAME())
BEGIN
BEGIN TRY
:r $(ScriptNameId)".SQL"
INSERT INTO dbo.ScriptsHistoryTableWithVeryNiceName
VALUES ('$(ScriptNameId)', DB_NAME(), SYSDATETIME());
END TRY
BEGIN CATCH
DECLARE @err VARCHAR(MAX) = ERROR_MESSAGE();
RAISERROR('One time script $(ScriptNameId).sql failed %s', 16, 1, @err);
END CATCH;
END;
GO
CREATE TABLE dbo.ScriptsHistoryTableWithVeryNiceName
(
ScriptNameId VARCHAR(255) NOT NULL
, DatabaseName sysname NOT NULL
, ExecutionTime DATETIME2(7) NOT NULL
);
GO
3条答案
按热度按时间luaexgnf1#
使用一次性脚本时,可以使用
Script.PostDeployment.sql
和Script.PreDeployment.sql
文件分别在部署之前和之后执行脚本。要跟踪已执行的脚本,可以创建历史记录表来记录脚本名、数据库名和执行时间。在
Script.PostDeployment.sql
文件中,可以使用以下代码执行一次性脚本:在这段代码中,你可以通过设置
ScriptNameId
变量来指定一次性脚本的路径,如果这个脚本之前没有执行过,那么这个脚本文件将会被执行,并且它的详细信息会被添加到历史记录表中。下面是创建
dbo.ScriptsHistoryTableWithVeryNiceName
表的代码:重要提示:不能在一次性脚本文件本身中包含
GO
语句,因为这将导致外部脚本过早终止。5kgi1eie2#
我发现的最好的方法是确保您的脚本是可重复运行的或幂等的(对于冗长的)。
因此,如果要执行插入行之类的操作,请先检查它是否存在。
如果要设置参考数据或静态数据表,请使用merge语句。
如果要重建索引,请使用sys.stats检查上次重建的日期。
艾德
snz8szmq3#
唯一的方法是在条件语句中使用SQLCMD变量。假设在Project属性中将SQLCMD变量“IsTheFirstDeployment”设置为“1”,则可以在部署后脚本中使用类似于以下内容的内容: