Создание производных столбцов из столбца компонентов переменной длины - PullRequest
0 голосов
/ 24 апреля 2018

Я надеюсь получить ваше руководство по этому вопросу.У меня есть столбец, состоящий из разделов переменной длины, которые нужно разделить на отдельные дополнительные столбцы.Столбец PCMRetrievalCode имеет тип nvarchar и состоит из этого формата:

i.e. PO607CON1324

PO = Non-Package or PA = Package
607 = SchemaId --> could be more than 3 numbers, as the schema increases
CON = Container
1324 = ContainerId --> could be 3-5 numbers

Итак, в моем пакете служб SSIS я пытаюсь создать их как производные столбцы, но у меня возникают проблемы с выражением для разделения столбца PCMRetrievalCode.на основе компонентов переменной длины для SchemaID и ContainerID.Я попытался использовать функцию FINDSTRING, поскольку CHARINDEX отсутствует, и я пытаюсь использовать DT_WSTR, так как это SSIS-совместимый тип данных для типа данных SQL Server nvarch.Вот выражения, которые я пробую в Редакторе преобразования:

enter image description here

Я думаю, что выражения для PackageCode и SchemaID, надеюсь, будут в порядке, но этовыражение ContainerID, где у меня возникли трудности.Любой совет будет принята с благодарностью.Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

Я сделал это с двумя отдельными производными столбцами объектов.

Первый (GetPO и остаток для более простого анализа):

POorPA = LEFT(data,2)
leftover = SUBSTRING(data,3,9999)

Следующий производный столбец является более сложным:

ScemaID = LEFT(leftover,FINDSTRING(leftover,"C",1) - 1)
CON = SUBSTRING(leftover,FINDSTRING(leftover,"C",1),3)
ContainerID = RIGHT(leftover,FINDSTRING(REVERSE(leftover),"N",1) - 1)

Обоснование и предполагаемые понятия:

  1. PO или PA всегда 2 символа
  2. CON всегда присутствует для цели
  3. Идентификаторы являются числовыми (можно безопасно искать «C» и «N»)
0 голосов
/ 10 мая 2018

Спасибо за ваши предложения, все!

Мне удалось заставить его работать, используя следующие выражения для производных столбцов:

PackageCode: SUBSTRING(((DT_WSTR,15)PCMRetrievalCode),1,2)

SchemaID:  SUBSTRING((DT_WSTR,15)PCMRetrievalCode,3,FINDSTRING(((DT_WSTR,15)  
           PCMRetrievalCode),"C",1) - 3)  

ContainerID:  RIGHT(((DT_WSTR,15)PCMRetrievalCode),(LEN((DT_WSTR,15)
              PCMRetrievalCode) - FINDSTRING((DT_WSTR,15)
              PCMRetrievalCode,"N",1)))
0 голосов
/ 24 апреля 2018

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


Поскольку у вас есть постоянное значение CON в ваших данных, вы можете использовать его в качестве якоря, как вы это делали дляSchemaId и работа оттуда.Я думаю, что часть, которую вы упускаете, заключается в том, что вам не нужно указывать точное количество символов в строке в выражении SUBSTRING.Если вы просто хотите дойти до конца, вставьте туда 99999 и покончите с этим:

SUBSTRING(PCMRetrievalCode
         ,FINDSTRING(PCMRetrievalCode
                    ,"CON"
                    ,1
                    ) + 3
         ,99999
         )
...