Я выяснил, как это можно сделать.
Прежде всего, необходимо включить xp_cmdshell утилиту
RAISERROR ('Enabling xp_cmdshell utility...', 0, 1) WITH NOWAIT
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
EXEC sp_configure 'xp_cmdshell', 1
RECONFIGURE
GO
Далее вы должны определить хранимую процедуру, которая будет делать всю работу. Он работает путем чтения всех файлов во временную таблицу, а затем запускает SQLCMD команды для разбора каждого из найденных * .sql файлов
CREATE PROCEDURE [Builder].[RunScriptsInFolder]
@scriptsDir varchar(255)
AS
IF len(@scriptsDir) = 0
RETURN 0
DECLARE @Message VARCHAR(254)
SET @Message = 'Loading files in ' + @scriptsDir + ' directory...'
RAISERROR (@Message, 0, 1) WITH NOWAIT
DECLARE @FileList Table (FileNumber int identity(1,1), FileName varchar(255), Command varchar(2048))
DECLARE @OutputTable Table (Output varchar(MAX))
DECLARE @FileName varchar(255)
DECLARE @Command varchar(2048)
DECLARE @FileNum int
DECLARE @databaseName varchar(255)
SET @databaseName = db_name()
SET @Command = 'DIR /B /O:-N ' + @scriptsDir + '*.sql'
INSERT INTO @FileList (FileName) EXEC xp_cmdshell @Command
UPDATE @FileList SET Command = 'sqlcmd -d ' + @databaseName + ' -i "' + @scriptsDir + FileName + '"'
WHILE EXISTS(SELECT * FROM @FileList)
BEGIN
SELECT TOP(1) @FileNum = FileNumber, @FileName = FileName, @Command = Command FROM @FileList
SET @FileName = ' :r ' + @FileName
RAISERROR (@FileName, 0, 1) WITH NOWAIT
EXEC xp_cmdshell @Command
DELETE FROM @FileList WHERE FileNumber = @FileNum
END
RETURN 0;
Все, что вам нужно сделать сейчас называют эту хранимую процедуру (Вам необходимо пройти полный путь к папка, содержащая файлы SQL. Вы можете получить путь к вашему проекту из свойств MSBuild). Также обратите внимание, что я добавил несколько строк вокруг вызова вызова RunScriptsInFolder. Потому что вы не будете знать, какие файлы порядка в папке выполняются, вы должны отключить все внешние ключи проверки, прежде чем делать это, и включить их, как только вы закончили
RAISERROR ('Disabling all constraints...', 0, 1) WITH NOWAIT
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
---- Run all files specified folder
BEGIN TRANSACTION
EXEC [Builder].[RunScriptsInFolder] '$(ProjectDir)Scripts\Post-Deployment\Data\'
COMMIT TRANSACTION
---- Enable all constraints
RAISERROR ('Re-enabling all constraints...', 0, 1) WITH NOWAIT
exec sp_msforeachtable @command1="print '?'", @command2='ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all'
Вы также можете задаться вопросом, почему $ (ProjectDir) переменная Безразлично» т работа для вас. Чтобы включить его, откройте файл * .dbproj с текстовым редактором и добавьте этот код в конец.
<PropertyGroup>
<SetVariables>
<Variable Name="ProjectDir" Value="$(ProjectDir)" />
</SetVariables>
</PropertyGroup>
В качестве альтернативы вы можете открыть свойства проекта БД, найти вкладку Переменные и добавьте переменную набор ProjectDir = $ (ProjectDir)