Я использую @@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
Мой результат:
После удаления 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
Результат моей функции изменяется на:
Эта проблема возникла после обновления уровня совместимости базы данных до SQL Server 2019.
мой sql 2019 (150) - корпоративный
Это релиз, я хочу версию точный. Каков результат PRINT @@VERSION?
когда я меняю совместимость и понижаю ее. @@rowcount работает правильно
Поскольку в SQL Server 2017 не существовало скалярного встраивания.
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:) ( Гипервизор)
Обновите свой экземпляр; вы отстаете в обновлениях почти на 3 года и отстаете на 16 CU. Это была ошибка, которая была исправлена сто лет назад. @@ROWCOUNT было опущено во встраивании в CU2; который был выпущен 2020-02-13. В вашем экземпляре даже нет обновлений GDR, поэтому в нем есть известные недостатки безопасности.
Отдельное примечание; Корпоративная версия SQL Server 2019 не поддерживается в Windows 10. См. Поддержка операционной системы. Учитывая, что вы раскошелились на Enterprise, я предлагаю вам получить это на поддерживаемой серверной версии Windows. Я также предлагаю вам попросить одного из ваших администраторов баз данных начать более регулярно проверять наличие этих обновлений. Если вы платите большие деньги за предприятие, вы определенно можете позволить сотруднику обновить хост.
спасибо Я обновляю sql и решил эту проблему.





Как упоминалось другими, в новой (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;
Какая у вас версия SQL Server точный? Я бы посоветовал вам не обновлять свой экземпляр и иметь проблемы с встраиванием.