row\u number()将返回不同的返回值,作为tsql和用户定义函数

lvjbypge  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(343)

我有一张57行的表。我有下面的用户定义函数

Create alter FUNCTION [dbo]. [ufn_GenerateNewProductId]()
    RETURNS nvarchar (MAX)
    as
    begin
    declare @NewproductId nvarchar(MAX), @rowNum int
    select @rowNum=ROW_NUMBER() over (order by ProductId) from Products;
    set @rowNum=@rowNum+1+100;
    set @NewproductId='P' + cast(@rowNum as nvarchar(MAX));
    return @NewproductId;
    end

当我按如下方式调用用户定义函数时,它在@product中的值为'p158':

declare @product nvarchar(max);

select @product= dbo.ufn_GenerateNewProductId();

print @product;

当我如下调用它时,它将返回值'p102'。

select dbo.ufn_GenerateNewProductId();

请帮助我理解为什么在这两种情况下行数()的行为不同。

jc3wubiy

jc3wubiy1#

查询返回多行,因此未定义实际分配给标量变量的值。
看起来你真的想要 count(*) :

create or alter function [dbo].[ufn_generatenewproductid]()
returns nvarchar (max)
as
begin
    declare @newproductid nvarchar(max), @cnt int;
    select @cnt = count(*) + 101 from products;
    set @newproductid='P' + cast(@cnt as nvarchar(max));
    return @newproductid;
end

请注意,您可以跳过其中一个变量并直接计算新产品id:

create or alter function [dbo].[ufn_generatenewproductid]()
returns nvarchar (max)
as
begin
    declare @newproductid nvarchar(max);
    select @newproductid = concat('P', count(*) + 101) from products;
    return @newproductid;
end
d5vmydt9

d5vmydt92#

我怀疑您想生成一个新的产品id,其中id值比当前的产品数大一个。
如果是这样,你需要这样的逻辑:

Create alter FUNCTION dbo.ufn_GenerateNewProductId()
RETURNS nvarchar (MAX)
as begin
    declare @NewproductId nvarchar(MAX), @rowNum int

    select @NewproductId = concat('P', COUNT(*) + 1)
    from Products;
    return @NewproductId;
end;

如果删除了某些内容,您可能需要使用当前值并添加1:

Create alter FUNCTION dbo.ufn_GenerateNewProductId()
RETURNS nvarchar (MAX)
as begin
    declare @NewproductId nvarchar(MAX), @rowNum int

    select @NewproductId = concat('P', convert(int, max(stuff(productid, 1, 1, ''))) + 1)
    from Products;
    return @NewproductId;
end;

我强烈建议您不要这样做——代码有并发性问题,而且比其他方法慢得多。就用一个 identity 列来定义id。

相关问题