【发布时间】:2020-11-19 02:55:05
【问题描述】:
我有一个包含 57 行的表 Products。我有以下用户定义的功能
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();
请帮助我理解为什么在这两种情况下 Row_Number() 的行为会有所不同。
【问题讨论】:
-
您的用户定义函数没有意义。据推测,查询返回多行。然后将任意值分配给变量。
-
select @rowNum=ROW_NUMBER() over (order by ProductId) from Products;并没有多大意义。SELECT我们将返回一个数据集,而您将分配给一个标量变量。那应该是SET @rowNum = (SELECT COUNT(*) FROM from Products); -
我还怀疑这里有一些标量内联“功能”,但这不是函数的错误,而是函数的编写方式。
-
返回 nvarchar(max)?再试一次。
-
另外,查看函数名称
ufn_GenerateNewProductId表明您这样做是为了为表创建一个新的 id。一旦您有 2 个或更多同时交易,这将无法正常工作。 SQL Server 有一个IDENTITY属性和SEQUENCE对象是有原因的。
标签: sql sql-server count window-functions sql-function