0

我正在尝试构建可以用作列的默认值的 SQL 函数。该功能是关于如果用户没有分配图像,则随机选择头像图像路径。

我试图但一个完全错误的例子只是接近图像而不是解决方案

我需要做的是这样的

select top 1 from "avatar1,png, avatar2,png, avatar3.png, avatar4.png, avatar5.png"  order by rand();

我会把它转换成这样的函数

CREATE FUNCTION dbo.ReturnAvatar() 
RETURNS nvarchar(100)
AS   
BEGIN  
    DECLARE @ret nvarchar(100);  
        SET @ret = (select top 1 from "avatar1,png, avatar2,png, avatar3.png, avatar4.png, avatar5.png" as tbl order by rand());  
    RETURN @ret;  
END; 

这只是为了解释我无法申请的想法。我不知道 SQL Server 是否有这样的东西。

4

3 回答 3

1

这是一种方法:

CREATE VIEW getNewID AS SELECT newid() as new_id

CREATE FUNCTION dbo.ReturnAvatar() 
RETURNS nvarchar(100)
AS   
BEGIN  
    DECLARE @ret nvarchar(100);  
        SET @ret = (SELECT TOP 1 value
                    FROM
                        STRING_SPLIT('avatar1.png,avatar2.png,avatar3.png,avatar4.png,avatar5.png', ',')
                    ORDER BY (SELECT new_id FROM getNewID));
    RETURN @ret;  
END;

请注意,您当前的 CSV 文件名字符串似乎不正确,因为逗号不表示 Windows 或 Linux 中扩展名的开始。所以,我假设到处都是点。另外,如果你想使用STRING_SPLIT,你可以只拆分一个字符。因此,我假设逗号将是这里的分隔符。

于 2020-04-10T09:22:38.930 回答
0

您根本不需要创建表。只需将数字放入字符串中并随机选择数字:

select 'avatar'+str(round(rand()*5+1,0))+'.png'

会好的。

把它放到你的函数中,你就准备好了。

rand()产生 0..1(excl.) 所以你可以简单地将它乘以 5 并加 1 得到你的 1...5 范围

演示: http ://sqlfiddle.com/#!18/9eecb/82866


文档:

所以基本上你可以把它归结为:

 select 'avatar'+ltrim(str(rand()*5+1,20,0))+'.png'

于 2020-04-10T09:26:15.120 回答
0
create function dbo.ReturnAvatar(@uid uniqueidentifier, @avatars int = 10)
returns varchar(100)
as 
begin 
    return ('avatar' + cast(abs(checksum(@uid)) % isnull(abs(@avatars), 10)+1 as varchar(100)) + '.png')
end
go

create table myusers
(
username varchar(50),
theavatar varchar(100) default( dbo.ReturnAvatar(newid(), default))
);

insert into myusers(username)
select top (10000) 'user' + cast(row_number() over(order by(select null)) as varchar(50))
from master.dbo.spt_values as a
cross join master.dbo.spt_values as b;
go

select theavatar, count(*)
from myusers
group by theavatar;
go

drop table myusers;
于 2020-04-10T09:51:33.407 回答