Christopher Fernandes Ответов: 2

Получить максимальное значение в столбце VARCHAR(900)


У меня есть таблица, в которой я храню ID как VARCHAR(900) это столбец первичного ключа и не использую автоинкремент идентификации

Я создал идентификатор как ИЕ-1-1
Это продолжается, как IE-1-85000, пока не достигнет верхнего предела в обоих числах bigint
Теперь у меня есть около 85000 строк в нем
Но он все еще показывает IE-1-9 как максимальное значение, когда я запрашиваю его следующим образом

DECLARE @TempICFEventID TABLE(ID SMALLINT IDENTITY(1,1),SplitValue VARCHAR(MAX))

INSERT INTO @TempICFEventID VALUES ('IE-1-1')
SELECT MAX(SplitValue) FROM @TempICFEventID 
INSERT INTO @TempICFEventID VALUES ('IE-1-2')
SELECT MAX(SplitValue) FROM @TempICFEventID 
INSERT INTO @TempICFEventID VALUES ('IE-1-3')
SELECT MAX(SplitValue) FROM @TempICFEventID 
INSERT INTO @TempICFEventID VALUES ('IE-1-4')
SELECT MAX(SplitValue) FROM @TempICFEventID 
INSERT INTO @TempICFEventID VALUES ('IE-1-5')
SELECT MAX(SplitValue) FROM @TempICFEventID 
INSERT INTO @TempICFEventID VALUES ('IE-1-6')
SELECT MAX(SplitValue) FROM @TempICFEventID 
INSERT INTO @TempICFEventID VALUES ('IE-1-7')
SELECT MAX(SplitValue) FROM @TempICFEventID 
INSERT INTO @TempICFEventID VALUES ('IE-1-8')
SELECT MAX(SplitValue) FROM @TempICFEventID 
INSERT INTO @TempICFEventID VALUES ('IE-1-9')
SELECT MAX(SplitValue) FROM @TempICFEventID 
INSERT INTO @TempICFEventID VALUES ('IE-1-10')
SELECT MAX(SplitValue) FROM @TempICFEventID 
INSERT INTO @TempICFEventID VALUES ('IE-1-11')
SELECT MAX(SplitValue) FROM @TempICFEventID 
INSERT INTO @TempICFEventID VALUES ('IE-1-12')
SELECT MAX(SplitValue) FROM @TempICFEventID 
INSERT INTO @TempICFEventID VALUES ('IE-1-13')
SELECT MAX(SplitValue) FROM @TempICFEventID 
INSERT INTO @TempICFEventID VALUES ('IE-1-14')
SELECT MAX(SplitValue) FROM @TempICFEventID 
INSERT INTO @TempICFEventID VALUES ('IE-1-15')
SELECT MAX(SplitValue) FROM @TempICFEventID 
INSERT INTO @TempICFEventID VALUES ('IE-1-16')
SELECT MAX(SplitValue) FROM @TempICFEventID 
INSERT INTO @TempICFEventID VALUES ('IE-1-17')
SELECT MAX(SplitValue) FROM @TempICFEventID 
INSERT INTO @TempICFEventID VALUES ('IE-1-18')
SELECT MAX(SplitValue) FROM @TempICFEventID 
INSERT INTO @TempICFEventID VALUES ('IE-1-84999')
SELECT MAX(SplitValue) FROM @TempICFEventID 
INSERT INTO @TempICFEventID VALUES ('IE-1-85000')
SELECT MAX(SplitValue) FROM @TempICFEventID


Почему это происходит

Что я уже пробовал:

Это моя текущая логика для генерации идентификатора

DECLARE @Current VARCHAR(900)

DECLARE @Temp1 BIGINT
DECLARE @Temp2 BIGINT

DECLARE @Upper BIGINT
DECLARE @Middle SMALLINT
DECLARE @Lower BIGINT

SET @Lower = -9223372036854775808
SET @Middle = 0
SET @Upper = 9223372036854775807

SELECT @Current = MAX(Ref_ICFEvent_Id) FROM CaseMatrix_ICFEvent
PRINT @Current

DECLARE @TempICFEventID TABLE(ID SMALLINT IDENTITY(1,1),SplitValue VARCHAR(MAX))

IF(@Current IS NOT NULL)
BEGIN
 INSERT INTO @TempICFEventID(SplitValue)
 SELECT * FROM CaseMatrix_Split(@Current,'-')
 SELECT * FROM @TempICFEventID
 SELECT @Temp1 = CONVERT(BIGINT,SplitValue) FROM @TempICFEventID WHERE ID = 2
 SELECT @Temp2 = CONVERT(BIGINT,SplitValue) FROM @TempICFEventID WHERE ID = 3

 IF(@Temp1 IS NOT NULL AND @Temp2 IS NOT NULL)
 BEGIN
     IF(@Temp1 <> @Upper)
     BEGIN
         IF(@Temp2 <> @Upper)
         BEGIN
             SET @Temp2 = @Temp2 + 1
             SET @Ref_ICFEvent_Id = 'IE-' + CONVERT(VARCHAR(900),@Temp1) + '-' +  CONVERT(VARCHAR(900),@Temp2)
         END
         ELSE
         BEGIN
             SET @Temp1 = @Temp1 + 1
             IF(@Temp1 <> @Upper)
             BEGIN
                 SET @Temp2 = 1
                 SET @Ref_ICFEvent_Id = 'IE-' + CONVERT(VARCHAR(900),@Temp1) + '-' +  CONVERT(VARCHAR(900),@Temp2)
             END
             ELSE
             BEGIN
                 SET @Ref_ICFEvent_Id = 'MAXLIMIT'
             END
         END
     END
     ELSE
     BEGIN
         SET @Ref_ICFEvent_Id = 'MAXLIMIT'
     END
 END
END
ELSE
BEGIN
 SET @Ref_ICFEvent_Id = 'IE-1-1'
END

2 Ответов

Рейтинг:
1

Maciej Los

Следуйте инструкциям, предоставленным marc_s в этой теме: SQL-сервер - как автоинкрементных столбцов типа varchar[^]


Рейтинг:
0

Richard Deeming

IE-1-9 является максимальное значение.

Помните, что вы сохраняете значения в виде строк, поэтому вы используете сравнение строк.

Сравнение двух значений, IE-1-9 и IE-1-85000:

  • 'I' против 'I': равный
  • 'E' против 'E': равный
  • '-' против '-': равный
  • '1' против '1': равный
  • '-' против '-': равный
  • '9' против '8': "9" больше
  • Результат: 'IE-1-9' является больше, чем 'IE-1-8...'


Christopher Fernandes

Как насчет того, чтобы я вычеркнул префикс IE и разделил числа & затем сравнил число, создав пользовательскую функцию

Richard Deeming

Оно вероятно работа, но представление будет ужасным.

Следуйте инструкциям в ссылке, которую дал вам Мацей: сохраните два числа в отдельных числовых полях, используя составной первичный ключ. Затем можно либо добавить вычисляемый столбец для полного идентификатора, либо вычислить его в коде при отображении записей.

И как кто-то еще недавно упомянул, вы очень далеки от необходимости увеличивать первое число, если вы используете bigint. Максимум bigint ценность есть 9223372036854775808.

Dave Kreskowiak

Как насчет хранения фрагментов значения идентификатора в отдельных столбцах, а затем использования вычисляемого столбца для построения всего идентификатора из отдельных значений?

Christopher Fernandes

Да это то что я планирую сделать сейчас так как это так сильно влияет на производительность