, SQL

2016-04-12 11 views
1

'da sayı ve alfabe içeren işlevden iki karakter döndürür. Koşulu temel alarak iki karakter döndürecek bir işlev yapmak istiyorum., SQL

let ben bir tablo olduğunu varsayalım tbl_Dummy

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

tbl_dummy içinde Id Max değeri 01 ise, o zaman 02 döndürür ve 09 geçer zaman böyle devam, o zaman til 0A döndürür 0Z, bundan sonra 10 ve benzeri dönecektir.

Bunu yapmış, ancak bu her zaman MAX(Id) almanın

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 

cevap

2

yerine benim scenerio çalışmıyor, kendi tablosunda bir IDENTITY sütun eklemek gerekir ve bir hesaplanan sütun doğru Kimliği hesaplamak için .

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

Bu şekilde, tbl_Dummy bir satır eklemek kez her zaman en son Id için hesaplamak gerekmez. TempId sizin için bunu verecektir. istenen Id hesaplamak için nasıl gelince, burada tek yönlü döngü olmadan:

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

Örnek Kullanım:

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 

Sonuç:

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 

Referans:

  • Jef tarafından bir answer f benzer bir sorun üzerinde Moden: