6

Microsoft Data-Tier Application framework을 사용하여 DacPackage 개체를 기반으로 배포 스크립트를 만듭니다. 나는이 문제에 대한 대답은 내가 필요한 것을 것을 알고SQLCMD 모드의 ServerConnection.ExecuteNonQuery

Unhandled Exception: Microsoft.SqlServer.Management.Common.ExecutionFailureException: 
    An exception occurred while executing a Transact-SQL statement or batch. ---> 
    System.Data.SqlClient.SqlException: Incorrect syntax near ':'. 

...와 ... 그러나,이 스크립트를 실행하기 위해 Microsoft.SqlServer.Management.Smo.Server 클래스를 사용하는이 오류를

SqlConnection deployConnection = new SqlConnection(connBuilder.ToString()); 
deployConnection.Open(); 
Server server = new Server(new ServerConnection(deployConnection)); 
server.ConnectionContext.ExecuteNonQuery(deployScript); 

을 시도하고있다 SQLCMD 모드에 있어야하지만, 내 ServerConnection이 상기 모드에서 실행되도록 지시하는 방법을 모르겠습니다.

내 문제는 제목에 명시된 것만 큼 구체적이지 않습니다. 내가 정말로 할 수 있기를 원하는 것은 .Net 프레임 워크를 통해 DacPackage에서 생성 된 스크립트를 실행하는 것입니다. 아무도 이것으로 나를 도울 수 있습니까?

답변

9

SQLCMD 모드 명령은 이 아니며 T-SQL 명령입니다. SQL Server Management Studio (SSMS)/Visual Studio (VS) 및 SQLCMD.EXE에서만 작동합니다. SQLCMD 모드는 본질적으로 SQLCMD.EXE가 작동하는 방식이며 SSMS/VS에서 수동으로 활성화 할 수 있습니다. 그것은 그 응용 프로그램의 일부이며 공급자를 통해 수행 할 수있는 무언가가 아닙니다.

이러한 응용 프로그램은 SQLCMD 모드 명령을 해석하고이를 SQL Server로 전달하지 않습니다. SQLCMD 모드 명령은 먼저 구문 분석/실행되고 (제출할 SQL에 어떻게 영향을 미치는지), 최종 버전의 SQL이 SQL Server에 제출됩니다.

따라서 SQL Server 데이터 도구 (SSDT) ​​/ Visual Studio에서 생성 된 배포 SQL 스크립트는이 세 가지 프로그램 중 하나를 통해 실행해야합니다. 이미 .dacpac 파일을 가지고 있기 때문에

, Microsoft는 체크 아웃해야 그 사람을 게시 할 수있는 몇 가지 방법을 제공합니다

는 또한이 DacServices.GenerateDeployScript()를 통해 SQL 스크립트를 게시 만들 수 있지만이는 배포 게시/SQL 스크립트, 비주얼 스튜디오에서 생성 여부를 GenerateDeployScript() "{프로젝트 이름}을 게시"하기 때문에 위에 언급 한 바와 같이 상황을 변경되지 않습니다 동일한 스크립트입니다.

USE [$(DatabaseName)]; 

동안 : 그것은 최소한 다음 줄에 사용 $(DatabaseName) 될 것이다 :setvar:on error exit뿐만 아니라 SQLCMD 모드 변수로서 예 SQLCMD 모드 콜론 명령 것이다 의미 CommentOutSetVarDeclarations 속성을 true으로 설정하여 :on error exit 줄과 :setvar __IsSqlCmdEnabled "True" 줄을 남겨 두어 초기 :setvar 줄을 주석 처리 할 수 ​​있습니다.이 줄은 SQLCMD 모드가 활성화되었는지 여부를 감지하는 데 사용됩니다. 그냥이 특정 :setvar 선 위에 내용의 주석입니다 :

/* 
Detect SQLCMD mode and disable script execution if SQLCMD mode is not supported. 
To re-enable the script after enabling SQLCMD mode, execute the following: 
SET NOEXEC OFF; 
*/ 

그래서 그들은 정말 여부 DOS를 통해,이 스크립트는 SQLCMD를 통해 실행되는 것을 예정은 -> sqlcmd.exe를 또는 PowerShell을 -> 호출-SQLCMD를.

기술적으로 (stream 대신) 배포 스크립트 내용의 문자열을 생성하고 a) 콜론 명령을 제거하고 b) "$ (DatabaseName)"을 배포하려는 데이터베이스. 그러나이 방법을 사용하지 않았지만 추천하지는 않았습니다. SQL Server 데이터 도구에서 어떤 배포 스크립트를 생성 할 수 있는지에 대한 모든 상황에서 작동하는지 확신 할 수 없습니다. 하지만 옵션이있는 것 같습니다.

또한 약간 관련이 있습니다. SQL 스크립트를 실행하기 위해 SMO가 필요하지 않습니다. SMO는 T-SQL 명령을 직접 거치지 않고 개체를 통해 SQL Server와 상호 작용하는 수단입니다.

편집 : 다른 사람들이 시도하고 발견
링크가 작동하지 않았다 :

가능성을 작동하도록 생성 게시 SQL 스크립트를 가져 오기위한 프로그래밍 방식 :

Process.Start를 통해
+0

그래서이 프로그램 닷넷 프레임 워크에서 생성 된 SQLCMD 스크립트를 실행 할 * 방법 * 없다 - 당신이 무슨 말을하는지이다? –

+3

@ Danfordbes - 거의 예. 이 3 개의 프로그램 밖에는 그 콜론 명령이 무엇인지에 대한 단서가 없습니다. 그러나 C#에서 "SQLCMD.EXE -S server"에 대한 명령 줄을 호출하고 SQL 스크립트를 전달하기위한 스크립트 이름과 적절한 플래그를 제공하는 프로세스를 시작할 수 없다는 것을 의미하지는 않습니다. –

+1

대단히 감사합니다, @srutzky! –