Как извлечь каждые 7 символов nvarchar в другую таблицу? - PullRequest
1 голос
/ 08 июня 2019

У меня есть nvarchar (200) с именем ColumnA в Table1, который содержит, например, значение:

ABCDEFGHIJKLMNOPQRSTUVWXYZ

Я хочу извлечь каждые 7 символов в Table2, ColumnB и в итоге получить все этизначения ниже.

ABCDEFG
BCDEFGH
CDEFGHI
DEFGHIJ
EFGHIJK
FGHIJKL
GHIJKLM
HIJKLMN
IJKLMNO
JKLMNOP
KLMNOPQ
LMNOPQR
MNOPQRS
NOPQRST
OPQRSTU
PQRSTUV
QRSTUVW
RSTUVWX
STUVWXY
TUVWXYZ

[Не реальные имена таблиц и столбцов.]

Данные загружаются в Table1 и Table2 в пакете служб SSIS, и яЯ озадачиваюсь, лучше ли выполнять обработку строк в TSQL в задаче SQL или анализировать строку в компоненте сценария VB.

[Да, я думаю, что мы последние четыре на планете, использующие VB в Script Components.Я не могу убедить остальных трех, что эта вещь C # здесь, чтобы остаться.Хотя, может быть, это идеальное время для изгоя.]

Ответы [ 4 ]

2 голосов
/ 08 июня 2019

Вы можете использовать рекурсивный CTE, вычисляя шаг за шагом, и substring().

WITH
cte
AS
(
SELECT 1 n
UNION ALL
SELECT n + 1 n
       FROM cte
       WHERE n + 1 <= len('ABCDEFGHIJKLMNOPQRSTUVWXYZ') - 7 + 1
)
SELECT substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ', n, 7)
       FROM cte;

дб <> скрипка

1 голос
/ 09 июня 2019

Компонентное решение сценария

Предполагая, что имя входного столбца равно Column1

  1. Добавить компонент скрипта
  2. Открыть форму конфигурации компонента скрипта
  3. Перейти к вкладке «Входы и выходы»
  4. Щелкните значок «Вывод» и установите для свойства Synchronous Input значение None
  5. Добавить столбец вывода (пример outColumn1)
  6. В редакторе скриптов используйте аналогичный код в функции обработки строк:
Dim idx as integer = 0

While Row.Column1.length > idx + 7

    Output0Buffer.AddRow()
    Output0Buffer.outColumn1 = Row. 
    Column1.Substring(idx,7)

    idx +=1

End While
1 голос
/ 08 июня 2019

Если у вас есть таблица физических чисел, это легко. Если нет, вы можете создать подсчет на лету :

DECLARE @string VARCHAR(100)='ABCDEFGHIJKLMNOPQRSTUVWXYZ';

- Мы создаем подсчет, используя ROW_NUMBER для любой таблицы с достаточным количеством строк.

WITH Tally(Nmbr) AS
(SELECT TOP(LEN(@string)-6) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM master..spt_values)
SELECT Nmbr
      ,SUBSTRING(@string,Nmbr,7) AS FragmentOf7
FROM Tally
ORDER BY Nmbr;

Идея вкратце: Подсчет возвращает список чисел от 1 до n (n = LEN (@string) -6). Этот номер используется в SUBSTRING для определения начальной позиции.

0 голосов
/ 08 июня 2019

Вы можете сделать это с T-SQL следующим образом:

DECLARE C CURSOR LOCAL FOR SELECT [ColumnA] FROM [Table1]
OPEN C

DECLARE @Val nvarchar(200);
FETCH NEXT FROM C into @Val
WHILE @@FETCH_STATUS = 0 BEGIN
    DECLARE @I INTEGER;
    SELECT @I = 1;
    WHILE @I <= LEN(@vAL)-6 BEGIN
        PRINT SUBSTRING(@Val, @I, 7)
        SELECT @I = @I + 1
    END
    FETCH NEXT FROM C into @Val
END
CLOSE C
...