这是我第一次在论坛上发帖提问,因为我通常更愿意自己研究并找到答案,但我是程序员,足以承认数据库编程是我的阿基里斯的脚跟。
我希望创建一个base31标识列,用于我的数据库,或者从我正在阅读的内容,MAP SQL标识列到Base32列。
我正在尝试在00000-ZZZZZ范围内创建唯一的5位数字母数字序列。 (EX.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'
并通过存储过程或触发器(之前从未使用过触发器)向其发送Identity列值, 这会被接受吗?我是在正确的轨道上吗?
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的原始功能。我的老板认为我是一个天才,但实际上,如果不是互联网和有帮助的程序员向我展示道路,我只不过是一个外行人。
我希望这可以帮助其他人。
答案 0 :(得分:1)
我知道你有一个解决方案,但你的脚本有一些小问题:
我重新格式化了一下,得到了这个:
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;