sql >> Database teknologi >  >> RDS >> Sqlserver

Hvorfor tæller SSIS TOKEN-funktionen ikke tilstødende kolonneafgrænsere?

Årsag til problemet :

TOKEN metode i SSIS bruger implementeringen af ​​strtok funktion i C++ . Jeg indsamlede disse oplysninger, mens jeg læste bogen Microsoft® SQL Server® 2012 Integration Services stærk> . Det er nævnt som note på side 113 (Jeg kan godt lide denne bog! Masser af god information. ).

Jeg søgte efter implementeringen af ​​strtok funktion, og jeg fandt følgende links.

INFO:strtok():C-funktion -- dokumentationstillæg - Kodeeksemplet i dette link viser, at funktionen ignorerer på hinanden følgende skilletegn.

Svarene på de følgende SO-spørgsmål påpeger, at strtok funktion er designet til at ignorere på hinanden følgende afgrænsninger.

Behov for at vide, hvornår der ikke vises data mellem to token-separatorer ved hjælp af strtok()

strtok_s adfærd med konsekutive afgrænsninger

Jeg tror, ​​at TOKEN og TOKENCOUNT funktionerne fungerer efter design, men om det er sådan SSIS skal opføre sig, kan være et spørgsmål for Microsoft SSIS-teamet.

Original post - afsnittet ovenfor er en opdatering:

Jeg oprettede en simpel pakke i SSIS 2012 baseret på dine datainput. Som du havde beskrevet i dit spørgsmål, er TOKEN funktion ikke opfører sig efter hensigten. Jeg er enig med dig i, at funktionen ikke ser ud til at virke. Dette indlæg er ikke et svar på dit oprindelige problem.

Her er en alternativ måde at skrive udtrykket på på en relativt enklere måde. Dette virker kun, hvis det sidste segment i din inputpost altid vil have en værdi (f.eks. A1 , B2 , C3 osv.).

Udtryk kan omskrives som :

Denne sætning vil tage input-recorden som parameter, afgrænsningstegnet (^) som den anden parameter. Den tredje parameter beregner det samlede antal segmenter i posterne, når de opdeles med skilletegn. Hvis du har data i det sidste segment, har du med garanti to segmenter. Du kan derefter trække 1 fra for at hente det næstsidste segment.

(DT_STR,50,1252)TOKEN(OldImportRecord,"^",TOKENCOUNT(OldImportRecord,"^") - 1)

Jeg lavede en simpel pakke med dataflowopgave. OLE DB-kilden henter dataene og den afledte transformation parser og opdeler dataene som på skærmbilledet nedenfor. Outputtet indsættes derefter i destinationstabellen. Du kan se kilde- og destinationstabellerne på det sidste skærmbillede. Destinationstabellen har to kolonner. Den første kolonne gemmer de næstsidste segmentdata, og segmenterne tæller baseret på afgrænsningstegnet (som igen ikke er korrekt). Du kan bemærke, at den sidste post ikke gav de korrekte resultater. Hvis den sidste post ikke havde værdien 8 , så vil ovenstående udtryk mislykkes, fordi udtrykket vil evaluere til nul indeks.

Håber det er med til at forenkle dit udtryk.

Hvis du ikke hører fra nogen andre, vil jeg anbefale at logge dette problem på Microsoft Connect-webstedet .

Opret tabel og udfyld scripts :

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

Afledt kolonnetransformation i dataflowopgave :

Data i kilde- og destinationstabeller :



  1. postgresql med funktion wrap sql så langsom?

  2. mysql-forespørgsel for at få fødselsdage for de næste 10 dage

  3. Forberedte parametre LIKE-sætning Virker ikke med SQLSRV

  4. Indsæt i flere tabeller baseret på de andre tabeldata