SSDT + LinkedServer = 异构查询需要为连接设置 ANSI_NULLS 和 ANSI_WARNINGS 选项

Posted

技术标签:

【中文标题】SSDT + LinkedServer = 异构查询需要为连接设置 ANSI_NULLS 和 ANSI_WARNINGS 选项【英文标题】:SSDT + LinkedServer = Heterogeneous queries require the ANSI_NULLS and ANSI_WARNINGS options to be set for the connection 【发布时间】:2015-09-18 16:27:48 【问题描述】:

如果有人能帮助解决这个问题,我将不胜感激。我已经为此苦苦挣扎了太久,似乎无法解决。

我有一个带有存储过程的 SSDT 项目(VS2012、SQL2008) 引用链接服务器。

项目构建成功

尝试部署时,使用 (localdb) 或“常规”SQL 服务器,使用 F5 或 Schema Compare,部署失败,因为链接服务器未在目标中定义

定义链接服务器后,项目还是部署失败 任何引用链接服务器的存储过程:

错误 200 SQL72014:.Net SqlClient 数据提供者:消息 7405,级别 16, 状态 1,过程 usp_MemEligGetFullData,第 157 行异构 查询需要设置 ANSI_NULLS 和 ANSI_WARNINGS 选项 用于连接。这确保了一致的查询语义。使能够 这些选项,然后重新发出您的查询。

将 SET ANSI_NULL ON 和 SET ANSI_WARNINGS ON 添加到这些存储过程没有帮助,在项目属性的数据库设置中选择相应的复选框也没有帮助。

这对于企业环境中的整个团队来说是一个阻塞问题,因此,如果有人对为什么会发生这种情况有任何想法,我将不胜感激!

【问题讨论】:

【参考方案1】:
    在 Visual Studio 中, 右键单击存储过程 点击属性 将 ANSI Null 更改为“开启”

【讨论】:

当我将其更改为“ON”时,我看到警告消息“Property Value is not valid”。对此有什么想法吗? 您是否从列表中选择了它?还是您手动输入的?如果您手动输入,请尝试将其更改为 On 而不是 ON【参考方案2】:

尝试通过 SSMS 创建存储过程,但在 create procedure 语句之前分批执行 SET ANSI_NULLS ON 和 SET ANSI_WARNINGS ON,如下所示:

SET ANSI_NULLS ON 
SET ANSI_WARNINGS ON
GO
CREATE PROCEDURE usp_MemEligGetFullData AS /* stuff */

如果成功,则检查 SSDT 生成的脚本是否还包含在 create procedure 语句之前的那些 set 语句。如果没有,请确保您启用了脚本数据库选项设置。如果仍然没有,那么在最坏的情况下,您可以创建 deployment contributor 来修改生成的 TSQL。

【讨论】:

以上是关于SSDT + LinkedServer = 异构查询需要为连接设置 ANSI_NULLS 和 ANSI_WARNINGS 选项的主要内容,如果未能解决你的问题,请参考以下文章

Linked Server Login 添加和删除

EXEC(query) AT linkedServer 与 Oracle DB

Win10中如何枚举所有SSDT

WINDOWS 64位SSDT定位思路

SSDT - 交叉应用 OPENJSON

使用补丁修改DSDT/SSDT [DSDT/SSDT综合教程]