gpt4 book ai didi

c# - 如何在 SQL 中创建/映射 base31 "Identity"列

转载 作者:太空狗 更新时间:2023-10-29 21:58:26 25 4
gpt4 key购买 nike

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

我希望创建一个 base31 标识列以用于我的数据库,或者根据我正在阅读的内容,将 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(来 self 之前帖子的第二个链接)解释并真正分解了 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com