#sql-server #sql-server-2019
#sql-сервер #sql-server-2019
Вопрос:
У меня есть скалярнозначная функция, которую я использую в своей базе данных годами. Он всегда работал правильно. Недавно я перенес базу данных на 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?
ОБНОВЛЕНИЕ: @@ ВЕРСИЯ: Microsoft SQL Server 2019 (RTM-GDR) (KB4583458) — 15.0.2080.9 (X64) 6 ноября 2020 16:50:01 Авторское право (C) 2019 Microsoft Corporation Standard Edition (64-разрядная версия) на Windows Server 2019 Datacenter 10.0 (сборка 17763: ) (Гипервизор)
Комментарии:
1. Какая у вас версия SQL Server (ВЫБЕРИТЕ @@VERSION;)?
2. Ошибка уровня 20 или 21 пахнет как ошибка в SQL Server, особенно если она исправляется путем изменения уровня совместимости.
3. @Larnu, для помощи нам нужна полная версия SQL Server, включая ее сборку. В разных сборках 2019 было много ошибок, связанных с udfs.
4. Если вы используете последнюю версию CU, отправьте сообщение об ошибке в Azure
5. 15.0.2080.9 — это просто обновление GDR; так что да, вы отстаете на 9 CU (последняя версия — 15.0.4102.2). Как предлагали другие, я бы предложил обновить до последней версии CU, поскольку они не устранят ошибку на старом CU.
Ответ №1:
Я обновился до CU9, изменил совместимость до 150, и это работает! Microsoft SQL Server 2019 (RTM-CU9) (KB5000642) — 15.0.4102.2 (X64) 25 января 2021 20:16:12 Авторское право (C) 2019 Microsoft Corporation Standard Edition (64-разрядная версия) на Windows Server 2019 Datacenter 10.0 (сборка 17763: ) (Гипервизор)