Sql сцепить проблему? - PullRequest
       0

Sql сцепить проблему?

0 голосов
/ 11 марта 2011

В моей таблице есть столбец с именем Dep_user_code, который представляет собой не что иное, как employeeid ... Каждый раз, когда мне нужно увеличивать employeeid, когда я вставляю новое значение ... но в нем есть и алфавит, и число ... мне нужно увеличивать число в одиночку ... например, если мой employeeid равен 'NECUSER0001', то в следующий раз, когда я вставляю новый employeeid, он должен быть 'NECUSER0002' динамически, я должен генерировать вот так .. каждый раз, когда я вставляю значение, оно должно увеличиваться ..

Я пытался использовать строковую и числовую части, как это, но не знаю, как это реализовать ... Есть предложения?

select SUBSTRING(Dep_user_code,1,7)  from NEC_Customer_User_Map
select SUBSTRING(Dep_user_code,8,4)  from NEC_Customer_User_Map

Ответы [ 6 ]

1 голос
/ 11 марта 2011
WITH last AS (
  SELECT MAX(Dep_user_code) AS Code
  FROM NEC_Customer_User_Map
  WHERE LEFT(Dep_user_code, 7) = 'NECUSER'
)
SELECT LEFT(Dep_user_code, 7) + RIGHT(CAST(STUFF(Code, 1, 7, '1') AS int) + 1, 4)
FROM last

Часть RIGHT выполняет следующие действия:

  • заменяет 'NECUSER' на '1', получая что-то вроде '10002';
  • приводит к результату как int;
  • увеличивается на 1;
  • (неявно) преобразует значение в varchar и получает последние 4 символа.

Может быть, STUFF(Code, 1, 7, '1') лучше заменить на '1' + RIGHT(Code, 4), не уверен.

РЕДАКТИРОВАТЬ: Как это бывает, неявное преобразование может также использоваться в случае преобразования строки в целое число тоже:

... + RIGHT(STUFF(Code, 1, 7, '1') + 1, 4) ...

или

... + RIGHT('1' + RIGHT(Code, 4) + 1, 4) ...
1 голос
/ 11 марта 2011

Раньше мне приходилось поддерживать базы данных с такими настройками, и хотя я, как правило, не фанат этого стиля, я предполагаю, что у вас есть причины не хранить NECUSER в одном столбце и увеличивать тождественностьцелое число в другом столбце с PK, установленным на оба.Если нет, я бы предложил пойти по этому пути и позволить SQL сделать всю работу за вас.

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

SELECT SUBSTRING(Dep_user_code, 1, 7) + 
    RIGHT(
        REPLICATE('0', 3) +   --Ensure we have padding 0s
        IsNull(MAX(CAST(SUBSTRING(Dep_user_code, 8, 4) AS INT), -1) + 1  --Work with ints, find MAX or set NULL to -1 so +1 will = 0
    , 4)  --Only want 4 character total from RIGHT function
FROM NEC_Customer_User_Map
1 голос
/ 11 марта 2011

Если значение всегда текстовое, то числа, вы разделяете значение, используя Patindex:

Select Substring( Dep_user_code, 1, PatIndex( '%[0-9]%', Dep_user_code) - 1 ) As TextPortion
    , Substring( Dep_user_code, PatIndex( '%[0-9]%', Dep_user_code)
            , Len(Dep_user_code) ) As NumberPortion

Однако возможность использования идентификатора в сочетании с префиксом зависит от того, разрешены ли пропуски. Если вы не можете разрешить пропуски, вам нужно запросить следующее значение идентификатора, которое вы можете использовать, что может быть выполнено различными способами в зависимости от потребностей.

1 голос
/ 11 марта 2011

Вы также должны сохранить идентификационный ключ.используйте SELECT IDENT_CURRENT ('NEC_Customer_User_Map'), чтобы узнать последний вставленный идентификатор.

0 голосов
/ 12 марта 2011

Вы можете рассмотреть возможность использования обеих частей Dep_user_code в качестве отдельных файлов в вашей базе данных, чтобы воспользоваться некоторыми функциями tsql, такими как IDENTITY и IDENT_CURRENT ()

0 голосов
/ 11 марта 2011
 declare @max varchar(20)
 declare @number varchar(20)
 select @max =  max(cast(substring(dep_user_name , 8, 4) as int))  from NEC_Customer_User_Map (nolock)
 select @max = isnull(@max, 0) + 1
 select @max = (case     when len(@max) = 1 then '000' + @max
                         when len(@max) = 2 then '00' + @max
                         when len(@max) = 3 then '0' + @max
                         else @max 
                end)
 Select @number = (Substring( dep_user_name, 1, PatIndex( '%[0-9]%', dep_user_name) - 1 ) +   @max)  from NEC_Customer_User_Map                      
 insert into NEC_Customer_User_Map(Dep_User_Name)  values (@number )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...