У меня есть скалярная функция, которую я годами использую в своей базе данных. Он всегда работал корректно. Недавно я перенес базу данных на SQL Server 2019, и когда я изменил уровень совместимости на SQL Server 2019 (150), моя функция взорвалась, как нитроглицерин. Возврат уровня совместимости обратно к SQL Server 2017 (140) позволил работать в обычном режиме.
Это функция:
CREATE FUNCTION [dbo].[Authentication_SHA1ToBase64](@source AS varchar(8000))
RETURNS varchar(8000)
BEGIN
DECLARE
@bin varbinary(8000),
@result varchar(8000)
SET @bin = CONVERT(varbinary(8000), @source)
RETURN CAST(N'' as xml).value('xs:base64Binary(xs:hexBinary(sql:variable("@bin")))', 'varchar(8000)')
END
На уровне совместимости SQL Server 2019 (150) следующее:
SELECT [dbo].[Authentication_SHA1ToBase64]('0x640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA')
Ошибки следующим образом:
Msg 596, Level 21, State 1, Line 0
Cannot continue the execution because the session is in the kill state.
Msg 0, Level 20, State 0, Line 0
A severe error occurred on the current command. The results, if any, should be discarded.
Странно то, что если я просто выполню то же самое, что и запрос:
DECLARE
@bin varbinary(8000)
SET @bin = CONVERT(varbinary(8000), '0x640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA')
SELECT [Result]=CAST(N'' as xml).value('xs:base64Binary(xs:hexBinary(sql:variable("@bin")))', 'varchar(8000)')
Я получаю ожидаемый результат:
Result
--------------------------------------------------------
MHg2NDBBQjJCQUUwN0JFREM0QzE2M0Y2NzlBNzQ2RjdBQjdGQjVEMUZB
Может быть, есть какая-то внутренняя асинхронная проблема, которая нарушает функцию? Кто-нибудь знает, есть ли в SQL Server 2019 новый метод преобразования в base64?
ОБНОВЛЕНИЕ: @@VERSION: Microsoft SQL Server 2019 (RTM-GDR) (KB4583458) — 15.0.2080.9 (X64) 6 ноября 2020 г. 16:50:01 Copyright (C) 2019 Microsoft Corporation Standard Edition (64-разрядная версия) для Windows Server 2019 Datacenter 10.0 (сборка 17763:) (гипервизор)