2011-03-11 355 views
0

在我的表中,我有一個名爲Dep_user_code的列,它只是employeeid ...每當我插入一個新的值時,我需要增加employeeid ..但它有字母和數字..我需要單獨增加數字..例如,如果我的僱員是'NECUSER0001'意味着下一次當我插入它必須是'NECUSER0002'動態我不得不產生這樣this..everytime當我插入它必須增加值的新僱員..Sql連接問題?

我有嘗試像這樣的字符串部分和數字部分,但不知道如何實現此...任何建議?

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

回答

0
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) 
1

你還應該保留一個身份密鑰。使用SELECT IDENT_CURRENT('NEC_Customer_User_Map')找出最後插入的ID。

1

如果該值始終文本,然後編號,您裂開使用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 

但是,是否可以結合使用一個身份與前綴取決於你是否可以允許的差距。如果你不能允許差距,那麼你需要查詢你可以使用的下一個id值,這可以根據需要以各種方式完成。

1

我已經收到,支持數據庫,像這樣的設置,雖然我通常不喜歡這種風格的粉絲,我假設你有一些理由不存儲在一列中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
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) ... 
0

您可以考慮:當它發生時,隱式轉換也可以在字符串轉換爲整數太大的情況下使用爲了充分利用IDENTITY和IDENT_CURRENT()的幾個tsql特性,將Dep_user_code的兩個部分作爲單獨的文件在你的數據庫中。