2010-06-21 2 views
0

J'utilise VS2008 DBPro. Dans mon fichier PostDeploy J'ai beaucoup de lignes comme celui-ciLecture dynamique de fichiers dans VS DBPro (à l'aide de SQLCMD)

:r .\Data\Test\Classifiers.CodeType.data.sql 
:r .\Data\Test\Classifiers.Currency.data.sql 
:r .\Data\Test\Classifiers.LOB.data.sql 

Ce que je voudrais est de créer une ProjectName variables pour que je puisse easely déployer différentes données du projet. Quelque chose comme ça (ne fonctionne pas)

:setvar ProjectName "Test" 

:r .\Data\$(ProjectName)\Classifiers.CodeType.data.sql 
:r .\Data\$(ProjectName)\Classifiers.Currency.data.sql 
:r .\Data\$(ProjectName)\Classifiers.LOB.data.sql 

Il serait encore mieux si je pouvais lire tous les fichiers du dossier sans spécifier un chemin d'accès.

Répondre

0

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)