从 dacpac 部署和使用 ssms 创建时,sp 的执行存在差异

There is difference in execution of sp when deployed from dacpac and creating with ssms

在 SP 中,我将声明的变量与空字符串进行比较,如下所示。

Declare @str1 nvarchar(max)

if(@str1 <> '')

   true

else

   false

我已经通过数据库项目部署了这个 sp,并使用 ssms 手动创建了一个 sp。在运行时期间,使用 dacpac 创建的 sp 正在传递条件并变为 true,而使用 ssms 创建的 sp 失败并变为 false。现在,我将 Script Procedure As => Alter to => new query window from object explorer for the spcreated using dacpac 并且相同的条件失败并且控件变为 false.

使用这个版本:

Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) Oct 28 2016 18:17:30 Copyright (c) Microsoft Corporation Express Edition (64-bit) on Windows 10 Enterprise 6.3 (Build 19041)

:)

这与 ANSI_NULLS 设置有关(应该始终是 ON,FWIW,因为 OFF has been deprecated,但在一种情况下,您可以明确地或通过 SSMS 工具 > 选项)。

另外我可能会改成这样:

IF (@str1 > N'')

...无论 ANSI_NULLS 设置如何 (example)。

或更明确地说 (example):

IF (@str1 IS NOT NULL AND @str1 <> N'')

存储过程 meta-data 包括 2 个“粘性”SET 选项,QUOTED_IDENTIFIERSANSI_NULLS。 proc 的有效设置 created/altered 在执行时使用。

ANSI_NULLS 是这里的罪魁祸首。考虑:

SET ANSI_NULLS OFF;
GO
CREATE PROCEDURE dbo.Proc1
AS
DECLARE @str1 nvarchar(max);

if(@str1 <> '')
    PRINT 'true';
ELSE
    PRINT 'false';
GO


SET ANSI_NULLS ON;
GO
CREATE PROCEDURE dbo.Proc2
AS
DECLARE @str1 nvarchar(max);

if(@str1 <> '')
    PRINT 'true';
ELSE
    PRINT 'false';
GO

上述过程在执行时打印出不同的值。

注意 SSMS 默认将这两个选项都打开。 dacpac 包括在部署时使用的 proc 的设置。如果您使用数据库项目,则这两个选项都由存储过程属性控制。如果您通过 reverse-engineering 现有数据库创建 dacpac,则会存储源对象设置。

我强烈建议您始终启用这两个选项,以便与索引视图、过滤索引等兼容。