这是我第一次在论坛上发问,因为我通常更喜欢自己研究并找到答案,但是我是一名程序员,足以承认数据库编程是我的致命弱点。

我希望创建一个base31身份列以用于我的数据库,或者从我正在阅读的内容中将MAP SQL身份列转换为Base32列。

我正在尝试在00000-ZZZZZ范围内创建唯一的5位字母数字序列。 (例如0BG85)

我意识到字母数字代码并不理想,因为最终您的序列会拼出许多不适当的商务用语,因此我将消除元音(a,e,i,o,u)。因此,Base31。该项目的限制因素是我使用的是Code39条码实现,将我限制为0-9和A-Z(仅大写)。

我对数据库编程的了解有限,最初的想法是查询生成的最后一个ID,然后通过C#类通过算法递增下一个ID。我的直觉和我一直在阅读的所有内容都告诉我,这是执行任务的一种拙劣的,笨拙的方式。

我的研究使我了解到了这些资源

Custom Auto-Generated Sequences with SQL Server

Convert any integer to a string base 2 through 36

我想知道我是否使用了第二链接的功能

稍作编辑

Declare @alldigits as varchar(31);
Set @alldigits='0123456789BCDFGHJKLMNPQRSTVWXYZ'

并通过存储过程或触发器(过去从未使用过触发器)将其标识列值发送给它,
这可以接受吗?我在正确的轨道上吗?

**找到答案,但不允许我(新用户)再发表我自己的答案5个小时**
    FUNCTION dbo.CreateBase31ID
    (
@val as BigInt,
@base as int
)
returns varchar(63)
as
Begin
/* From http://sqltips.wordpress.com/2009/01/12/tsql-function-to-convert-decimal-to-hex-octal-or-any-other-base/  */
/* blog text:
SQL Tips by Namwar Rizvi
  Frequently I see the questions in newsgroups about a function to convert
  integer value to other bases like base 2 (binary), base 8 (octal) and base 16(hex).
  Following TSQL function, which was orginally mentioned by Itzik Ben-Gan
  in his book Inside Microsoft SQL Server 2005:TSQL Querying, provides you the
  ability to convert a given integer into any target base.
  I have just updated the function with more meaningful names and added some
  comments to clear the logic.
*/

  /* Check if value is valid and if we get a valid base (2 through 36) */
  If (@val<0) OR (@base < 2) OR (@base> 36) Return Null;

  /* variable to hold final answer */
  Declare @answer as varchar(63);

  /* Following variable contains all
     possible alpha numeric letters for any valid base
  */
  Declare @alldigits as varchar(31);
  Set @alldigits='0123456789BCDFGHJKLMNPQRSTVWXYZ'

  /* Set the initial value of
     final answer as empty string
  */
  Set @answer='';

  /* Loop while the source value remains greater than 0 */
  While @val>0
  Begin
    Set @answer=Substring(@alldigits,@val % @base + 1,1) + @answer;
    Set @val = @val / @base;
  End

  /* Return the final answer */
  return @answer;
End

将“身份列”值发送到函数时,此函数将正常工作。它完美地映射到我手工计算的测试值。
我要真正感谢Namwar Rizvi的原始代码示例,以及Brian Biales(来自我以前的文章的第二个链接)解释并真正破坏了Namwar的原始功能。我的老板们认为我是个天才,但实际上,如果不是为了互联网和有帮助的程序员为我提供帮助,那么我将不过是外行。

我希望这可以帮助其他人。

最佳答案

我知道您有解决方案,但是您的脚本有一些小问题:

  • 为什么它返回VARCHAR(63),该大小具体是什么?您在尝试返回VARCHAR(MAX)时会遇到问题,所以我想您需要知道最大的结果是什么?
  • ,您要检查2到36之间的有效底数,但是32到36之间的任何数字都将用尽转换位数;
  • 您只想真正转换为基数31,那么为什么要对基数进行参数设置?

  • 我重新格式化了一下,并得到了:
    FUNCTION BigIntToBase31Ish (
        @Value BIGINT)
    RETURNS VARCHAR(255)
    AS
    BEGIN
        DECLARE @Result VARCHAR(255) = '';
        DECLARE @Base INT = 31;
        DECLARE @ConvertDigits VARCHAR(31) = '0123456789BCDFGHJKLMNPQRSTVWXYZ';
    
        --Is the integer value valid?
        IF @Value < 0
            RETURN NULL;
    
        --Convert the integer value to base 31
        WHILE @Value > 0
        BEGIN
            SELECT @Result = SUBSTRING(@ConvertDigits,@Value % @Base + 1, 1) + @Result;
            SELECT @Value = @Value / @Base;
        END;
        RETURN @Result;
    END;
    

    关于c# - 如何在SQL中创建/映射base31 "Identity"列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15533701/

    10-17 02:45