2010-06-21 4 views
0

Я использую VS2008 DBPro. В моем файле PostDeploy У меня есть много линий, как это одинДинамически читаемые файлы в VS DBPro (с использованием SQLCMD)

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

То, что я хотел бы это создать переменную Projectname, чтобы я мог Ис развернуть различные проектные данные. Что-то вроде этого (не работает)

:setvar ProjectName "Test" 

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

Было бы еще лучше, если бы я мог прочитать все файлы в папке, не указав путь к нему.

ответ

0

Я выяснил, как это можно сделать.

Прежде всего, необходимо включить 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)