创建唯一引用号的函数

时间:2013-10-20 05:50:15

标签: tsql sql-server-2005

我有一个使用SQL Server 2005的asp.net应用程序。在这个应用程序中,我想创建一个函数,为新的查询ID返回唯一的参考号。

我读到了UNIQUEIDENTIFIER,但它有一个特定的格式,如1548C3E02-2D73-4244-8787-D45AC590519A

我想要输出1703-HJIF-2012。这里首先有当前日期部分的组合,如日期和月份,第二个是自动生成的随机字符串,第三个是当前日期的年份部分。我不知道如何创建这样的函数以及如何从存储过程调用此函数并从函数获取具有此必需格式的结果字符串。

请帮帮我..

1 个答案:

答案 0 :(得分:1)

这样做的简单方法是使用rand()内置函数生成随机字符串(参考编号的中间部分)。遗憾的是,SQL Server不允许您创建非确定性函数,这基本上意味着您无法在自己的函数中调用rand()

一种简单(但稍微丑陋)的解决方法是将随机字符串作为参数传递,因为您可以从存储过程中调用rand()。听起来很混乱?它应该是这样的(假设你的随机字符串应该只包含大写字母):

create function UniqueRefNum (@r1 float, @r2 float, @r3 float, @r4 float)
returns char(14)
begin
    -- Not sure if rand() might return 1.0
    -- If it does, the conversion code below would produce a character that's not an
    -- uppercase letter so let's avoid it just in case
    if @r1 = 1.0 set @r1 = 0
    if @r2 = 1.0 set @r2 = 0
    if @r3 = 1.0 set @r3 = 0
    if @r4 = 1.0 set @r4 = 0

    declare @now datetime
    set @now = getdate() -- or getutcdate()

    declare @m char(2)
    if month(@now) < 10
        set @m = '0' + month(@now)
    else
        set @m = month(@now)

    declare @d char(2)
    if day(@now) < 10
        set @d = '0' + day(@now)
    else
        set @d = day(@now)

    return @m + @d + '-' + 
           char(65 + cast(@r1 * 26 as int)) + 
           char(65 + cast(@r2 * 26 as int)) + 
           char(65 + cast(@r3 * 26 as int)) + 
           char(65 + cast(@r4 * 26 as int)) + 
           '-' + cast(year(@now) as varchar)
end

然后从存储过程中调用该函数,如下所示:

declare @uniqueRef char(14)
set @uniqueRef = dbo.UniqueRefNum(rand(), rand(), rand(), rand())