J'ai découvert comment cela pouvait être fait.
D'abord, vous devez activer xp_cmdshell utilitaire
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
Ensuite, vous devez définir une procédure stockée qui fera tout le travail. Il fonctionne en lisant tous les fichiers dans une table temporaire, puis exécute la commande SQLCMD pour analyser chacun des fichiers trouvés * .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;
Tout ce que vous avez à faire est maintenant appeler cette procédure stockée (vous devez passer chemin complet dossier contenant des fichiers SQL.Vous pouvez obtenir le chemin d'accès à votre projet à partir des propriétés MSBuild). Notez également que j'ai ajouté quelques lignes autour de l'appel à l'appel RunScriptsInFolder. Parce que vous ne saurez pas où les fichiers de commande dans votre dossier sont vous exécutées devez désactiver tous les contrôles clés étrangères avant de le faire et leur permettre, une fois que vous avez terminé
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'
Vous peut aussi se demander pourquoi variable $ (ProjectDir) n » t travail pour toi. Pour l'activer, ouvrez votre fichier * .dbproj avec l'éditeur de texte et ajoutez ce code à la fin.
<PropertyGroup>
<SetVariables>
<Variable Name="ProjectDir" Value="$(ProjectDir)" />
</SetVariables>
</PropertyGroup>
Vous pouvez également ouvrir vos propriétés du projet DB, trouver onglet Variables et ajouter une variable set ProjectDir = $ (ProjectDir)