Проблема при использовании @@rowcount для функции в SQL Server 2019

Я использую @@rowcount в своих функциях следующим образом:

ALTER FUNCTION [dbo].[GetUserNameFamily] 
    (@UsrID INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @Name NVARCHAR(MAX)
    DECLARE @Family NVARCHAR (MAX)
    DECLARE @cou INT
    
    SELECT @Name = ut.Fname, @Family = ut.Lname
    FROM User_tbl ut 
    WHERE ut.UserID = @UsrID

    IF @@ROWCOUNT = 0
        RETURN 'row 0'

    IF @Name IS NULL
        SET @Name = ''

    IF @Family IS NULL  
        SET @Family = ''

    RETURN @Name + ' ' + @Family    
END

Когда я использую эту функцию в таком запросе:

declare @ID int=3118

select * 
from Files_tbl 
where RefID = @ID    -- query rows affected is 0
    
select 
    dbo.GetUserNameFamily(TicketResponse_tbl.CreateByUserID) as CreateByFullName
from 
    TicketResponse_tbl
where 
    TicketResponse_tbl.TicketID = @ID

Мой результат:

Проблема при использовании @@rowcount для функции в SQL Server 2019

После удаления where в запросе «select Files_tbl» и изменения затронутых строк этого запроса с 0 на n.

declare @ID int = 3118

select * 
from Files_tbl 
-- where RefID = @ID  -- query rows affected is not 0
    
select 
    dbo.GetUserNameFamily(TicketResponse_tbl.CreateByUserID) as CreateByFullName
from 
    TicketResponse_tbl
where 
    TicketResponse_tbl.TicketID = @ID

Результат моей функции изменяется на:

Проблема при использовании @@rowcount для функции в SQL Server 2019

Эта проблема возникла после обновления уровня совместимости базы данных до SQL Server 2019.

Какая у вас версия SQL Server точный? Я бы посоветовал вам не обновлять свой экземпляр и иметь проблемы с встраиванием.

Larnu 09.05.2022 19:35

мой sql 2019 (150) - корпоративный

ehsanHB 09.05.2022 19:37

Это релиз, я хочу версию точный. Каков результат PRINT @@VERSION?

Larnu 09.05.2022 19:37

когда я меняю совместимость и понижаю ее. @@rowcount работает правильно

ehsanHB 09.05.2022 19:38

Поскольку в SQL Server 2017 не существовало скалярного встраивания.

Larnu 09.05.2022 19:39

Microsoft SQL Server 2019 (окончательная первоначальная версия) — 15.0.2000.5 (X64) 24 сентября 2019 г. 13:48:23 Copyright (C) Microsoft Corporation Enterprise Edition 2019 (64-разрядная версия) в Windows 10 Pro 10.0 <X64> (сборка 22000:) ( Гипервизор)

ehsanHB 09.05.2022 19:39

Обновите свой экземпляр; вы отстаете в обновлениях почти на 3 года и отстаете на 16 CU. Это была ошибка, которая была исправлена ​​сто лет назад. @@ROWCOUNT было опущено во встраивании в CU2; который был выпущен 2020-02-13. В вашем экземпляре даже нет обновлений GDR, поэтому в нем есть известные недостатки безопасности.

Larnu 09.05.2022 19:40

Отдельное примечание; Корпоративная версия SQL Server 2019 не поддерживается в Windows 10. См. Поддержка операционной системы. Учитывая, что вы раскошелились на Enterprise, я предлагаю вам получить это на поддерживаемой серверной версии Windows. Я также предлагаю вам попросить одного из ваших администраторов баз данных начать более регулярно проверять наличие этих обновлений. Если вы платите большие деньги за предприятие, вы определенно можете позволить сотруднику обновить хост.

Larnu 10.05.2022 10:38

спасибо Я обновляю sql и решил эту проблему.

ehsanHB 10.05.2022 18:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как упоминалось другими, в новой (2019 г.) функции под названием Скалярное встраивание UDF, которая включала побочные функции, такие как @@ROWCOUNT, есть была ошибка. Обновление до последней сборки SQL Server (которое вы должны сделать в любом случае) исправило бы это.


Как бы то ни было, чтобы продолжать использовать Inlining, вы можете избежать @@ROWCOUNT, упростив свою функцию следующим образом.

CREATE OR ALTER FUNCTION [dbo].[GetUserNameFamily] 
    (@UsrID INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    RETURN ISNULL((
        SELECT CONCAT(ut.Fname, ' ', ut.Lname)
        FROM User_tbl ut 
        WHERE ut.UserID = @UsrID
    ), 'row 0');
END

Но я бы посоветовал вам просто преобразовать это во встроенную табличную функцию, которая всегда будет встроенной:

CREATE OR ALTER FUNCTION [dbo].[GetUserNameFamily] 
    (@UsrID INT)
RETURNS TABLE
AS RETURN

SELECT
  ISNULL((
        SELECT CONCAT(ut.Fname, ' ', ut.Lname)
        FROM User_tbl ut 
        WHERE ut.UserID = @UsrID
    ), 'row 0') AS UserName;

Вы используете это так

SELECT n.UserName
FROM YourTable t
CROSS APPLY dbo.GetUserNameFamily(t.Id) n;

Другие вопросы по теме