使用特定标量UDF生成DACPAC时出现NULL引用异常



我有一个SQL Server 2017数据库,其中有一个特定的UDF,当我试图通过SSMS或sqlpackage导出dacpac时,该UDF会出错。VisualStudio在ssdt中工作时也会抛出错误。功能正常,没有问题。这里包含了一个具有相同问题的函数的简化版本。您可以创建一个空数据库,添加函数,dacpac提取将失败。我知道这里有糟糕的设计选择,但这只是脚本的一个例子,它仍然再现了错误。

功能:

CREATE FUNCTION [dbo].[testFunction]
(
@string varchar(max)
)
RETURNS bit
AS
BEGIN
DECLARE @Valid BIT = CASE WHEN EXISTS (
SELECT *
FROM STRING_SPLIT(@string, ',') s
OUTER APPLY (select LEN(s.value) AS l) AS l
)
THEN 0 ELSE 1 END
RETURN @Valid
END

它实际上只需要一个逗号分隔的字符串,将其拆分,进行外部应用以生成长度(我知道,愚蠢的IRL,但演示(。然而,当试图提取dacpac时,它给出错误";对象引用未设置为对象的实例">

如果我将select*更改为selects.value,或者选择1,那么瞧,dacpac会生成,visual studio不会崩溃。

有人知道为什么上面代码中的select*会导致dacpac失败吗?我们正在评估使用ssdt进行源代码管理,但像上面这样的随机东西并没有给我带来使用它的好感觉,因为它显然比sql引擎本身做了更多的代码验证。

环境:

SQL Server 2017标准

VS 2019安装了SSDT的社区

SQLPackage内部版本15.0.4826.1

我打赌您会受到SSDT中以下错误的影响:如果使用STRING_SPLIT ,则SSDT无法编译

它应该在几年前解决,请检查您是否使用DACFX运行时17.0.1或更新的

如果使用VS函数提取数据层应用程序,可以取消选中验证提取。当我使用dacpac恢复Azure SQL DB托管实例数据库时,我不得不这样做,该数据库的视图将另一个数据库引用到内部部署服务器。否则,它将创建一个有效的千兆字节dacpac,该dacpac无法在内部部署,并出现与您相同的错误。

最新更新