从包含SQL中的数字和字母的函数返回两个字符

时间:2016-04-12 05:50:38

标签: sql sql-server sql-function

我想根据条件制作返回两个字符的函数。

假设我有一张表 tbl_Dummy

CREATE TABLE [dbo].[tbl_Dummy](
    [Id] [varchar](2) NOT NULL,
    [Name] [varchar](30) NOT NULL
)

如果tbl_dummy中Id的最大值为01,则返回02,依此类推,当它传递给09时,则返回0A直到0Z,之后它将返回10,依此类推。

我已经这样做了,但这不适用于我的场景

create FUNCTION dbo.GenerateValue ()
RETURNS VARCHAR(250)
AS BEGIN
    DECLARE @counter int = 1;
    DECLARE @Work VARCHAR(2)
    DECLARE @temp VARCHAR(2)
    DECLARE @tempW VARCHAR(2)
    declare @value int 

    select @Work = MAX(id) from tbl_Dummy
    WHILE @counter <= DATALENGTH(@Work)
   BEGIN
   SELECT  @temp = ASCII(SUBSTRING(@Work, @counter, 1))
   SET @counter = @counter + 1
   if @temp >= '48' and @temp <= '56' or @temp >= '65' and @temp <= '89'
   begin
        select @value = CONVERT(INT, @temp) 
        set @value = @temp + 1
   end
   else if @temp = '57'
        set @value = 'A'
    else if @temp = '90'
        set @tempW = '0'
   set @tempW +=   CHAR(ASCII(SUBSTRING(@Work, @counter, 1)))
   END
    RETURN @work
END

1 个答案:

答案 0 :(得分:2)

您不应每次都获得MAX(Id),而应在表格中添加IDENTITY列和计算列以计算正确的ID。

CREATE TABLE tbl_Dummy(
    TempId  INT IDENTITY(1, 1),
    Id      AS ISNULL(dbo.GenerateValue(TempId),'') PERSISTED,
    Name    VARCHAR(30) NOT NULL
)

这样,在tbl_Dummy中插入一行后,您不必总是计算最新的IdTempId将为您提供。至于如何计算所需的Id,这里有一种没有循环的方法:

CREATE FUNCTION dbo.GenerateValue (@N INT)
RETURNS CHAR(2) WITH SCHEMABINDING AS
BEGIN
RETURN 
(
    SELECT returnStr =      
        SUBSTRING(Str1, (@N/36) % LEN(Str1) + 1, 1) + --LeftMost 
        SUBSTRING(Str1, (@N/1) % LEN(Str1) + 1, 1) --RightMost
    FROM (
        SELECT '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    ) d(Str1)
);

样本用法:

INSERT INTO dbo.tbl_Dummy(Name)
SELECT TOP 20
    SomethingElse = 'Random' + CONVERT(VARCHAR(10), ROW_NUMBER() OVER(ORDER BY (SELECT NULL)))
FROM sys.all_columns ac1

SELECT * FROM dbo.tbl_DUmmy

结果:

TempId      Id   Name
----------- ---- ------------------------------
1           01   Random1
2           02   Random2
3           03   Random3
4           04   Random4
5           05   Random5
6           06   Random6
7           07   Random7
8           08   Random8
9           09   Random9
10          0A   Random10
11          0B   Random11
12          0C   Random12
13          0D   Random13
14          0E   Random14
15          0F   Random15
16          0G   Random16
17          0H   Random17
18          0I   Random18
19          0J   Random19
20          0K   Random20

参考:

  • Jeff Moden对answer提出的类似问题: