首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLCMD模式下的ServerConnection.ExecuteNonQuery

问SQLCMD模式下的ServerConnection.ExecuteNonQuery
EN

Stack Overflow用户
提问于 2014-10-28 19:49:25
回答 1查看 9.5K关注 0票数 13

我正在使用Microsoft数据-分层应用程序框架创建一个基于DacPackage对象的部署脚本。我试图使用Microsoft.SqlServer.Management.Smo.Server类来执行这个脚本.

代码语言:javascript
复制
SqlConnection deployConnection = new SqlConnection(connBuilder.ToString());
deployConnection.Open();
Server server = new Server(new ServerConnection(deployConnection));
server.ConnectionContext.ExecuteNonQuery(deployScript);

然而,这个错误与.

代码语言:javascript
复制
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在上述模式下执行。

我想我的问题不像我在标题中所说的那么具体。我真正需要做的是通过DacPackage框架执行从.Net生成的脚本。有人能帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-28 20:07:08

SQLCMD模式命令不是those命令;它们只在( SSMS ) / Visual (VS)和SQLCMD.EXE中工作。SQLCMD-模式本质上是SQLCMD.EXE的工作方式,可以在SSMS/VS中手动启用;它是这些应用程序的一部分,而不是通过提供程序可以完成的工作。

这些应用程序解释SQLCMD模式命令,而不将它们传递给Server。首先解析/执行SQLCMD模式命令(这是它们如何影响即将提交的SQL ),然后将SQL的最终版本提交给Server。

因此,SQL Server Data Tools (SSDT) / Visual Studio生成的部署SQL脚本需要通过这三个程序之一运行。

由于您已经有了一个.dacpac文件,所以微软提供了几种方法来发布您应该查看的文件:

您还可以通过DacServices.GenerateDeployScript()创建发布SQL脚本,但这不会改变上述情况,因为发布/部署SQL脚本(无论是从Visual“发布{project_name}”还是从GenerateDeployScript()生成的脚本)都是相同的脚本。这意味着它将具有SQLCMD模式冒号命令(如:setvar和:on error exit )以及SQLCMD模式变量,这些变量至少将是在以下行中使用的$(DatabaseName):

代码语言:javascript
复制
USE [$(DatabaseName)];

虽然可以通过将:setvar的DacDeployOptions属性设置为true来注释初始的:on error exit行,但仍然会留下:on error exit行和用于检测是否启用了SQLCMD模式的:setvar __IsSqlCmdEnabled "True"行。就在这条特定的:setvar行的上方,有一条评论声明:

代码语言:javascript
复制
/*
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数据工具可以生成什么样的部署脚本的所有情况下都能工作。但这似乎是一种选择。

此外,更重要的是:您不需要SMO来运行SQL脚本。SMO是通过对象而不是直接通过T命令与Server交互的手段。

编辑:

其他人尝试过并发现它不起作用的链接:

使生成的发布SQL脚本可编程地工作的可能性:

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26617247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档