2016-04-12 9 views
1

Ich möchte eine Funktion machen, die zwei Zeichen basierend auf der Bedingung zurückgibt.geben Sie zwei Zeichen aus der Funktion mit Zahlen und Alphabet in SQL zurück

sagen wir mal ich einen Tisch haben tbl_Dummy

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

wenn Max Wert von Id in tbl_dummy 01 ist, dann kehrt er 02, und so weiter, wenn es um die 09 geht, dann gibt es 0A til 0Z, danach 10 und so weiter.

Ich habe dies getan, aber das funktioniert nicht in meinem scenerio

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 

Antwort

2

Statt die MAX(Id) jedes Mal zu bekommen, sollten Sie eine IDENTITY Spalte in der Tabelle und eine berechnete Spalte zu berechnen, die richtige Id hinzufügen .

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

Auf diese Weise, wenn Sie in tbl_Dummy eine Zeile einfügen Sie müssen für die neueste Id nicht immer berechnen. Die TempId wird das für Sie geben. Was, wie die gewünschten Id zu berechnen, hier ist eine Möglichkeit, ohne Looping:

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) 
); 

Probe Verbrauch:

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 

Ergebnis:

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 

Referenz:

  • Ein answer von Jef f Moden über ein ähnliches Problem: