2016-04-12 124 views
1

我想要根据条件返回两个字符的函数。从SQL中包含数字和字母的函数返回两个字符

让说我有一个表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,依此类推。

我已经这样做了,但这不是我之情况的工作,每次得到MAX(Id)

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 

回答

2

相反,你应该在你的表中添加一个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 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 
    ) 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 

参考:

  • Jef的answer f Moden对类似问题:
相关问题