Более эффективный способ разделения данных - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть скрипт для импорта старого товара в новую систему. Новая система требует, чтобы номер детали и ревизия были отдельными, и это хорошо, не знаю, кто решил, что это не должно быть в случае со старой системой.

Я нахожу это довольно медленным, пока я тестирую, и, похоже, это связано с разделением номера детали и ревизии. Это та часть моего сценария

CASE 
    WHEN ISNUMERIC(RIGHT([Our_Part_No],1)) = 0 AND 
         LEFT(SUBSTRING([Our_Part_No],1,LEN([Our_Part_No])-1),30) 
             COLLATE DATABASE_DEFAULT IN (Select PMA_PART_ONLY from ASC_PMA_TBL)
        THEN LEFT(SUBSTRING([Our_Part_No],1,LEN([Our_Part_No])-1),30)
    ELSE LEFT([Our_Part_No],30)
    END As [Part No],
CASE 
    WHEN [Our_Part_No] COLLATE DATABASE_DEFAULT NOT IN (SELECT PMA_PART_ONLY FROM ASC_PMA_TBL )
    THEN 
        CASE
            WHEN ISNUMERIC(RIGHT([Our_Part_No],1)) = 1 Then ''
            ELSE Upper(RIGHT([Our_Part_No],1))
        END
    ELSE ''
    END As [Rev]

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

Любой способ повысить эффективность выделенияпересмотр со старых данных.

РЕДАКТИРОВАТЬ:

Пример данных с our_part_no в качестве исходных данных и Part No и Rev выход

enter image description here

EDIT2: исходные данные для проверки запасных частей верны. PMA_PART_REV равно varchar(16) и PMA_PART_REV равно varchar(4)

enter image description here

1 Ответ

1 голос
/ 08 ноября 2019

Вы можете написать функцию табличного значения

CREATE OR ALTER FUNCTION fn_Rev 
(   
    @p1 nvarchar(50)
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT  
        CASE 
            WHEN RIGHT(@P1, 1) NOT LIKE '[0-9]' THEN LEFT(@p1, LEN(@p1) - 1)
            ELSE @P1
        END as Part_Number,
        CASE 
            WHEN RIGHT(@P1, 1) NOT LIKE '[0-9]' THEN UPPER(RIGHT(@P1, 1))
            ELSE NULL
        END as Revision,
        CASE 
            WHEN RIGHT(@P1, 1) NOT LIKE '[0-9]' THEN 1
            ELSE 0
        END as HasRevision
)

Пример

DECLARE @Parts AS TABLE (
    Our_Part varchar(50) not null
)

insert into @Parts
VALUES
('699-227A'),
('699-229A'),
('699-298A'),
('7010-0026'),
('7010-0039'),
('7080-0015')


select *
from @Parts AS p CROSS APPLY
    fn_Rev(p.Our_Part) as c

Результат

|-----------|-----------------|------------|-------------|  
| Our_Part  |Part_Number      |Revision    |HasRevision  |  
|-----------|-----------------|------------|-------------|  
|699-227A   |699-227          |A           |1            |  
|699-229A   |699-229          |A           |1            |  
|699-298A   |699-298          |A           |1            |  
|7010-0026  |7010-0026        |NULL        |0            |  
|7010-0039  |7010-0039        |NULL        |0            |  
|7080-0015  |7080-0015        |NULL        |0            |  
|-----------|-----------------|------------|-------------|  

Вы также можете присоединиться (ВЛЕВО | ВПРАВО) к PMA_PART_REV чтобы проверить, существуют ли они

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...