SQL Server: генерирование числа для столбца - PullRequest
0 голосов
/ 16 сентября 2011

Вот ситуация, с которой я сейчас борюсь.

У меня есть две таблицы: Pro1, Pro2 (справочная таблица)

Pro1 : ID int, ProviderID1 varchar(25)

Pro2 : ID int, ProviderID2 varchar(25)

Вот эта вещь. Оба ProviderIDs (1,2) всегда ABCxxxxxxxxxxxx (всего 15) с префиксом ABC. pro2 также заполняется другими префиксами, но нас это не интересует.

Теперь мне нужно заполнить pro1.ProviderID согласно:

  • регистрация pro2 максимальное значение where ProviderID2 like 'ABC%'
  • теперь для providerID1 добавьте 1 к существующему максимальному providerid2
  • , если не найдено в pro2, то сгенерировать новый providrid1 с префиксом abc- "ABC000000000100"
  • продолжайте добавлять 1 для следующего providerid1.
* +1040 * Пример: * * тысяча сорок один скажем, в pro2, MAX(providerID2) найдено ABC000000000111
поэтому в pro1, providerid1 он должен генерировать ABC000000000112 и ABC000000000113 для следующих ID1 и т. д.

Если в pro2 НЕТ providerID2, где providerid2 like 'ABC%', генерировать ABC000000000100, ABC000000000101 для следующего и т. Д.

Обратите внимание, что providerid ВСЕГДА должно быть ABC, за которым следует 12 целых чисел (всего 15).

Большое спасибо! Вот что я использую:

IF  (SELECT count(providerid2) FROM pro2 WHERE providerid2 like 'ABC%')>0

   BEGIN

     IF object_id('tempdb..#te') is not null
     DROP TABLE #te
     CREATE TABLE #te (id int,pid int,pid2 varchar(15),providerid1 varchar(20))
     INSERT INTO #te (id)
     SELECT id FROM pro1  

     DECLARE @oldID int
     SET @oldID =  (SELECT right (MAX(providerID2),12) FROM pro2 WHERE providerid2 like 'ABC%')
     UPDATE #te
     SET pID = new
     FROM ( SELECT pid,new =   
            ROW_NUMBER() OVER(PARTITION BY ID ORDER BY ID) + @oldID end
            FROM #te)  #te

     DECLARE @pid TABLE (pid int)
     INSERT INTO @pid (pid) SELECT pid FROM #te

     UPDATE #te
     SET pid2 = (SELECT stuff(replicate('0',12),12 - len(pid) +1,12,pid))FROM #te
     DECLARE @pid2 TABLE (pid2 int)
     INSERT INTO @pid2 (pid2) SELECT pid2 FROM #te 
     UPDATE #te
     SET providerID1 = 'ABC' + CONVERT(VARCHAR(15), pid2, 15) FROM #te

     UPDATE pro1
     SET providerID1 = #te.providerid1
     FROM pro1
     INNER JOIN #te on #te.id = pro1.ID


   END

ELSE


     IF object_id('tempdb..#tempr') is not null
     DROP TABLE #tempr
     CREATE TABLE #tempr (id int,pid int,pid2 varchar(15), providerID1 varchar(15))
     INSERT INTO #tempr (id)
     SELECT id FROM pro1

     UPDATE #tempr
     SET pID = new
     FROM ( SELECT pid,new = 
            ROW_NUMBER() OVER(PARTITION BY ID  ORDER BY ID) + 99 end
            FROM #tempr)  #tempr                   

     DECLARE @pi TABLE (pid int)
     INSERT INTO @pi (pid) SELECT pid FROM #tempr
     UPDATE #tempr
     SET pid2 = (SELECT stuff(replicate('0',12),12 - len(pid) +1,12,pid)) FROM #tempr

     DECLARE @pi2 TABLE (pid2 int)
     INSERT INTO @pi2 (pid2) SELECT pid2 FROM #tempr 
     UPDATE #tempr
     SET providerID1 = 'ABC' + CONVERT(VARCHAR(15), pid2, 15) FROM #tempr 

     UPDATE pro1
     SET providerID1 = #tempr.providerid1
     FROM pro1
     INNER JOIN #tempr on #tempr.id = pro1.ID
...