2015-11-18 4 views
0

Я пытаюсь создать уникальный номер карты из следующей функции. Я поставил свой запрос внутри цикла while, чтобы предотвратить дублирование номера карты, но все же я получаю повторяющиеся номера.SQL Server WHILE

Кто-нибудь может мне помочь?

Create FUNCTION GetCardNumber() 
RETURNS varchar(20) 
AS 
BEGIN 
    Declare @NewID varchar(20); 
    Declare @NewID1 varchar(36) ; 
    Declare @Counter int = 0; 

    While(1=1) 
    Begin 
     Set @NewID1 = (SELECT [MyNewId] FROM Get_NewID); 
     Set @NewID = '2662464' + '823' + '001' +right(YEAR(GETUTCDATE()),2) +(left(convert(varchar,ABS(CAST(CAST(@NewID1 AS VARBINARY(5)) AS bigint))),5)); 
     Set @Counter = (Select count(*) from ContactTBL where ContactMembershipID = @NewID); 

     If @Counter = 0 
     BEGIN 
      BREAK; 
     END 
    End 

    return @newID 
END 
Go 

Обновление: Я получаю MyNewID из просмотра:

CREATE VIEW Get_NewID 
AS 
SELECT NEWID() AS MyNewID 
GO 

Большое спасибо заранее.

+0

@GordonLinoff: NewID() не будет работать в функции –

+1

, , Я знаю это. Тогда я сразу забыл об этом. Затем мне снова напомнили. Приветствия. –

+0

Как ваш запрос может получить повторяющиеся значения? Я мог видеть, что вы получите бесконечный цикл, но я не вижу, как любые значения будут дублироваться. –

ответ

2

Не будет ли это возвращать одинаковое значение при каждом его запуске? Я не вижу нигде, где вы увеличиваете что-либо, или получаете какую-то ценность, которая давала бы вам уникальные значения каждый раз. Вам нужно сделать что-то, что изменяет значение каждый раз, например, используя текущую точную дату и время.

Вы возвращения VARCHAR (20) в строке 2. Для того, чтобы получить 'уникальный' NewID, вы делаете это:

Set @NewId = (13 цифр постоянное значение) + (последние 2 цифры от текущего года) +

left(

    convert(varchar, 
     ABS(CAST 
     (CAST(@NewID1 AS VARBINARY(5)) AS bigint) 
     ) 
    ) 

,5) 

, который оставляет вам только 5 символов уникальности! Это почти наверняка проблема. Легким исправлением может быть увеличение символов, возвращаемых в строке 2, например. RETURNS varchar(30)

То, что вы делаете, излишне сложно, и я думаю, что есть элемент overprotecting против возможных повторяющихся значений. Эта линия очень подозреваемый:

Set @NewID = '2662464' + '823' + '001' +right(YEAR(GETUTCDATE()),2) +(left(convert(varchar,ABS(CAST(CAST(@NewID1 AS VARBINARY(5)) AS bigint))),5)); 

Максимум для BIGINT является 2^63-1, поэтому Отдавая свой 5-байтовый VARBINARY к BIGINT может привести к переполнению, что также может вызвать проблему.

Я не уверен точно, чего вы пытаетесь достичь, но вам нужно упростить вещи и убедиться, что у вас больше возможностей для уникальных ценностей!

+1

Я получаю NewID от View как обновляю свой вопрос, каждый раз, когда цикл будет получать новый NewID –

0
Set @NewID1 = (SELECT [MyNewId] FROM Get_NewID); 

всегда возвращают один и тот же результат (если нет других изменений)

Set @NewID = '2662464' + '823' + '001' +right(YEAR(GETUTCDATE()),2) +(left(convert(varchar,ABS(CAST(CAST(@NewID1 AS VARBINARY(5)) AS bigint))),5)); 

как результат @New_ID будет то же самое и

+0

Я получаю NewID1 от просмотра, и каждый получает newID –

+0

Я имею в виду, что конструкция as - (SELECT [MyNewId] FROM Get_NewID); не описывать - как @ NewID1 будет уникальным? –

+0

Как вы можете видеть в Обновленном вопросе, я получаю NewID1 из представления, который генерирует значение на основе NewID() –

Смежные вопросы