如何解决使用特定的标量UDF
我有一个带有特定UDF的SQL Server 2017数据库,尝试通过SSMS或sqlpackage导出dacpac时出现错误。在ssdt中工作时,VisualStudio也会引发错误。该功能有效,并且那里没有问题。这里包含的是该功能的精简版,存在相同的问题。您可以创建一个空数据库,添加该函数,然后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,但是demo)。 但是,尝试提取dacpac时会出现错误“对象引用未设置为对象的实例。”
如果我将select *更改为s.value或选择1,那么瞧,dacpac生成并且Visual Studio不会崩溃。
对于上述代码中的select *为什么会导致dacpac失败,有任何想法吗?我们正在评估使用ssdt进行源代码控制,但是当上面的随机操作显然比sql引擎本身执行更多的代码验证时,上面的随机内容不会给我带来使用感。
环境:
SQL Server 2017标准版
已安装SSDT的VS 2019社区
SQLPackage内部版本15.0.4826.1
解决方法
我敢打赌,您会受到SSDT中以下错误的影响: SSDT failing to compile if STRING_SPLIT is used
应该在几年前解决,请检查您是否在使用DACFX运行时17.0.1或更高版本
,如果使用VS功能“提取数据层应用程序”,则可以取消选中“验证提取”。使用dacpac还原具有将另一个数据库引用到本地服务器的视图的Azure SQL DB受管实例数据库时,我必须执行此操作。否则,它似乎会创建一个有效的数千兆字节的dacpac,无法将其部署在内部,并且出现与您相同的错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。