【发布时间】:2020-09-04 13:56:07
【问题描述】:
所以我有这样的简单字符串加密包装函数:
CREATE FUNCTION dbo.FncStringEncrypt(
@Cipher NVARCHAR(MAX),
@Text NVARCHAR(MAX),
@Salt NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
IF @Cipher IS NULL OR @Cipher = ''
BEGIN
RETURN NULL
END
IF @Text IS NULL OR @Text = ''
BEGIN
RETURN NULL
END
DECLARE @_encryptionBinary varbinary(max)
IF @Salt IS NOT NULL AND
@Salt <> ''
BEGIN
set @_encryptionBinary = ENCRYPTBYPASSPHRASE(@Cipher, @Text, 1, @Salt)
END
ELSE
BEGIN
set @_encryptionBinary = ENCRYPTBYPASSPHRASE(@Cipher, @Text)
END
RETURN cast('' as xml).value('xs:base64Binary(sql:variable("@_encryptionBinary"))', 'varchar(max)')
END
在各种版本 14 及更低版本的机器上试过,效果很好。 当我在 Sql Server 2019(版本:15.0.2070.41)中使用它时,我收到错误消息:
消息 596,第 21 级,状态 1,第 0 行 无法继续执行,因为会话处于终止状态。 消息 0,级别 20,状态 0,行 0 当前命令发生严重错误。结果,如果有的话,应该丢弃。 完成时间:2020-06-13T20:32:25.6110034+03:00
但奇怪的是,如果我单独使用 ENCRYPTBYPASSPHRASE 那么它适用于每个版本:
SELECT ENCRYPTBYPASSPHRASE('aglmule','ilemak',1,'ilemak')
【问题讨论】:
-
我怀疑这是一个内联问题。如果您禁用内联(在函数定义中使用
WITH INLINE = OFF),您会得到相同的行为吗? Disabling Scalar UDF Inlining without changing the compatibility level -
@Larnu 的怀疑是正确的。除非我指定提示或关闭
TSQL_SCALAR_UDF_INLINING数据库范围配置,否则我在使用该函数时会在错误日志中看到访问冲突。 -
欣赏答案。非常感谢。
标签: tsql sql-function sql-server-2019