Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Mengapa fungsi SSIS TOKEN gagal menghitung pembatas kolom yang berdekatan?

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 :



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pelarian yang benar dari pengidentifikasi yang dibatasi di SQL Server tanpa menggunakan QUOTENAME

  2. Daftar Semua Kolom Identitas di Database SQL Server:sys.identity_columns

  3. CROSS JOIN vs INNER JOIN dalam SQL

  4. Pilih contoh pertama dari sebuah catatan

  5. Cara Tercepat untuk Menjalankan Kueri yang Sama Beberapa Kali di SQL Server