簡體   English   中英

SQLCMD模式下的ServerConnection.ExecuteNonQuery

[英]ServerConnection.ExecuteNonQuery in SQLCMD Mode

我正在使用Microsoft Data-Tier Application框架來創建基於DacPackage對象的部署腳本。 我試圖使用Microsoft.SqlServer.Management.Smo.Server類來執行此腳本...

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

然而,這錯誤...

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 ':'.

我知道這個問題的答案是我需要處於SQLCMD模式,但我不知道如何告訴我的ServerConnection在所述模式下執行。

我想我的問題不像我在標題中說的那樣具體。 我真正需要做的是通過.Net框架執行從DacPackage生成的腳本。 誰能幫我這個?

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腳本,無論是從Visual Studio“Publish {project_name}”還是GenerateDeployScript() ,是相同的腳本。 意思是,它將具有SQLCMD模式冒號命令,例如:setvar:on error exit以及SQLCMD模式變量,它們至少是$(DatabaseName) ,用於以下行:

USE [$(DatabaseName)];

雖然可以注釋掉初始:setvar通過設置線DacDeployOptions財產CommentOutSetVarDeclarationstrue ,仍然會留下:on error exit產品,以及為一個行:setvar __IsSqlCmdEnabled "True" ,用來檢測是否是否已啟用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; 
*/

所以他們確實打算只通過SQLCMD運行這個腳本,無論是通過DOS - > SQLCMD.EXE還是PowerShell - > Invoke-SqlCMD。

從技術上講,可以生成一個部署腳本內容的字符串(而不是stream ),並通過a)刪除任何冒號命令來操縱該字符串,以及b)將“$(DatabaseName)”替換為您想要的任何數據庫部署到。 但是,我沒有嘗試過這個,我不推薦這個,我不確定它是否適用於SQL Server Data Tools可以生成哪些部署腳本的所有情況。 但它似乎是一種選擇。

此外,有點相關:您不需要SMO來運行SQL腳本。 SMO是通過對象而不是直接通過T-SQL命令與SQL Server交互的手段。

編輯:
其他人嘗試過的鏈接,發現它不起作用:

使生成的發布SQL腳本以programmaticaly方式工作的可能性:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM