Przyczyna problemu :
TOKEN
metoda w SSIS wykorzystuje implementację strtok
funkcja w C++ . Zebrałem te informacje podczas czytania książki Microsoft® SQL Server® 2012 Integration Services
. Jest wymieniony jako uwaga na stronie 113 (Podoba mi się ta książka! Mnóstwo ciekawych informacji. ).
Szukałem implementacji strtok
funkcji i znalazłem następujące linki.
INFO:strtok():Funkcja C — dodatek do dokumentacji - Przykładowy kod w tym łączu pokazuje, że funkcja ignoruje kolejne znaki ogranicznika.
Odpowiedzi na następujące pytania SO wskazują, że strtok
funkcja została zaprojektowana tak, aby ignorować kolejne ograniczniki.
zachowanie strtok_s z kolejnymi ogranicznikami
Myślę, że TOKEN
i TOKENCOUNT
funkcje działają zgodnie z projektem, ale to, jak powinny zachowywać się SSIS, może być pytaniem dla zespołu Microsoft SSIS.
Oryginalny post – Powyższa sekcja to aktualizacja:
Stworzyłem prosty pakiet w SSIS 2012 na podstawie wprowadzonych danych. Jak opisałeś w swoim pytaniu, TOKEN
funkcja nie działa zgodnie z przeznaczeniem. Zgadzam się z tobą, że funkcja nie działa. Ten post nie odpowiedź na Twój pierwotny problem.
Oto alternatywny sposób napisania wyrażenia w stosunkowo prostszy sposób. Będzie to działać tylko wtedy, gdy ostatni segment w rekordzie wejściowym zawsze będzie miał wartość (powiedzmy A1 , B2 , C3 itp.).
Wyrażenie można przepisać jako :
Ta instrukcja przyjmie rekord wejściowy jako parametr, a daszek ogranicznika (^) jako drugi parametr. Trzeci parametr oblicza całkowitą liczbę segmentów w rekordach podzielonych przez ogranicznik. Jeśli masz dane w ostatnim segmencie, masz gwarancję, że masz dwa segmenty. Następnie możesz odjąć 1, aby pobrać przedostatni segment.
(DT_STR,50,1252)TOKEN(OldImportRecord,"^",TOKENCOUNT(OldImportRecord,"^") - 1)
Stworzyłem prosty pakiet z zadaniem przepływu danych. Źródło OLE DB pobiera dane i pochodną transformację analizuje i dzieli dane zgodnie z poniższym zrzutem ekranu. Dane wyjściowe są następnie wstawiane do tabeli docelowej. Na ostatnim zrzucie ekranu możesz zobaczyć tabele źródłową i docelową. Tabela docelowa ma dwie kolumny. Pierwsza kolumna przechowuje dane o przedostatnim segmencie i liczbę segmentów na podstawie ogranicznika (co znowu nie jest poprawne). Możesz zauważyć, że ostatni rekord nie przyniósł poprawnych wyników. Jeśli ostatni rekord nie miał wartości 8
, powyższe wyrażenie nie powiedzie się, ponieważ wyrażenie ma indeks zerowy.
Mam nadzieję, że pomoże to uprościć Twoją ekspresję.
Jeśli nie skontaktujesz się z kimkolwiek innym, zalecamy zalogowanie się do tego problemu w witrynie Microsoft Connect .
Utwórz tabelę i wypełnij skrypty :
CREATE TABLE [dbo].[SourceTable](
[OldImportRecord] [varchar](50) NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[DestinationTable](
[NewImportRecord] [varchar](50) NOT NULL,
[CaretCount] [int] NOT NULL
) ON [PRIMARY]
GO
INSERT INTO dbo.SourceTable (OldImportRecord) VALUES
('1^Apple^0001^01/01/2010^Anteater^A1'),
('2^Banana^0002^03/15/2010^Bear^B2'),
('3^Cranberry^0003^4/15/2010^Crow^C3'),
('4^^0004^6/15/2010^Duck^D4'),
('5^^^^Emu^E5'),
('6^^^^Geese^F6'),
('^^^^Pheasant^G7'),
('8^^^^Sparrow^');
GO
Wyprowadzona transformacja kolumny w zadaniu przepływu danych :
Dane w tabelach źródłowych i docelowych :