Alasan masalah :
TOKEN
metode di SSIS menggunakan implementasi strtok
fungsi di C++ . Saya mengumpulkan informasi ini saat membaca buku Layanan Integrasi Microsoft® SQL Server® 2012
. Disebutkan sebagai catatan di halaman 113 (Saya suka buku ini! Banyak informasi bagus. ).
Saya mencari implementasi strtok
fungsi dan saya menemukan tautan berikut.
INFO:strtok():Fungsi C -- Tambahan Dokumentasi - Contoh kode di tautan ini menunjukkan bahwa fungsi mengabaikan karakter pembatas berurutan.
Jawaban atas pertanyaan SO berikut menunjukkan bahwa strtok
fungsi dirancang untuk mengabaikan pembatas berurutan.
Perlu mengetahui kapan tidak ada data yang muncul di antara dua pemisah token menggunakan strtok()
perilaku strtok_s dengan pembatas berurutan
Menurut saya TOKEN
dan TOKENCOUNT
fungsi berfungsi sesuai desain, tetapi apakah SSIS seharusnya berperilaku seperti itu mungkin menjadi pertanyaan bagi tim Microsoft SSIS.
Postingan Asli - Bagian di atas adalah pembaruan:
Saya membuat paket sederhana di SSIS 2012 berdasarkan input data Anda. Seperti yang telah Anda jelaskan dalam pertanyaan Anda, TOKEN
fungsi tidak berperilaku seperti yang dimaksudkan. Saya setuju dengan Anda bahwa fungsinya tampaknya tidak berfungsi. Pos ini tidak jawaban untuk masalah awal Anda.
Berikut adalah cara alternatif untuk menulis ekspresi dengan cara yang relatif lebih sederhana. Ini hanya akan berfungsi jika segmen terakhir dalam catatan input Anda akan selalu memiliki nilai (misalnya A1 , B2 , C3 dll.).
Ekspresi dapat ditulis ulang sebagai :
Pernyataan ini akan mengambil catatan input sebagai parameter, tanda sisipan pembatas (^) sebagai parameter kedua. Parameter ketiga menghitung total jumlah segmen dalam catatan saat dipisahkan oleh pembatas. Jika Anda memiliki data di segmen terakhir, Anda dijamin memiliki dua segmen. Anda kemudian dapat mengurangi 1 untuk mengambil segmen kedua dari belakang.
(DT_STR,50,1252)TOKEN(OldImportRecord,"^",TOKENCOUNT(OldImportRecord,"^") - 1)
Saya membuat paket sederhana dengan tugas aliran data. Sumber OLE DB mengambil data dan transformasi turunan mem-parsing dan membagi data sesuai tangkapan layar di bawah ini. Output tersebut kemudian dimasukkan ke dalam tabel tujuan. Anda dapat melihat tabel sumber dan tujuan di tangkapan layar terakhir. Tabel tujuan memiliki dua kolom. Kolom pertama menyimpan data segmen kedua dari belakang dan jumlah segmen berdasarkan pembatas (yang lagi-lagi tidak benar). Anda dapat melihat bahwa catatan terakhir tidak mengambil hasil yang benar. Jika catatan terakhir tidak memiliki nilai 8
, maka ekspresi di atas akan gagal karena ekspresi akan dievaluasi ke indeks nol.
Semoga dapat membantu menyederhanakan ekspresi Anda.
Jika Anda tidak mendengar kabar dari orang lain, saya sarankan untuk mencatat masalah ini di situs web Microsoft Connect .
Buat tabel dan isi skrip :
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
Transformasi kolom turunan di dalam tugas aliran data :
Data di tabel sumber dan tujuan :