2010-06-21 6 views
0

VS2008 DBPro를 사용하고 있습니다. 내 PostDeploy 파일에서 나는 내가 다른 프로젝트 데이터를 배포 easely 수있는 변수 프로젝트 이름을 만드는 것입니다 내가하고 싶은이 하나VSDBPro에서 동적으로 파일 읽기 (SQLCMD 사용)

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

같은 많은 라인을 가지고있다. 이런 식으로 뭔가 (작동하지 않습니다)

: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 

다음을 활성화해야합니다. 그것은 임시 테이블에 모든 파일을 읽는 과정에 그 기능이 작동하고 당신이 지금해야 할 일은 당신은 전체 경로를 통과해야 (이 저장 프로 시저를 호출한다

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 각 파일을 구문 분석 SQLCMD 명령을 실행 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> 

은 또한 당신이 당신의 DB 프로젝트 속성을 열고 탭 변수를 찾아 설정 변수 PROJECTDIR = $를 추가 할 수 있습니다 (PROJECTDIR)