Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dlaczego funkcja SSIS TOKEN nie zlicza ograniczników sąsiednich kolumn?

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.

Musisz wiedzieć, kiedy żadne dane nie pojawiają się między dwoma separatorami tokenów za pomocą strtok()

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 :



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Korzystanie z kolumny pochodnej funkcji rankingowej w klauzuli WHERE (SQL Server 2008)

  2. Błąd instalacji SQL Server 2008:Poprzednie wersje Microsoft Visual Studio 2008

  3. Wiele NOT LIKE na serwerze sql

  4. Jak wykonać wygenerowany skrypt (plik .sql) ze schematem i danymi w SQL Server 2008

  5. Jak mogę zwrócić wiele wierszy jako jeden wiersz w T-SQL?