从 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_IDENTIFIERS
和 ANSI_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,则会存储源对象设置。
我强烈建议您始终启用这两个选项,以便与索引视图、过滤索引等兼容。
在 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_IDENTIFIERS
和 ANSI_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,则会存储源对象设置。
我强烈建议您始终启用这两个选项,以便与索引视图、过滤索引等兼容。