Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tại sao hàm SSIS TOKEN không đếm được các dấu phân cách cột liền kề?

Lý do của sự cố :

TOKEN trong SSIS sử dụng việc triển khai strtok hàm trong C ++ . Tôi đã thu thập thông tin này khi đọc sách Dịch vụ tích hợp Microsoft® SQL Server® 2012 . Nó được đề cập như ghi chú trên trang 113 ( Tôi thích cuốn sách này! Rất nhiều thông tin hay. ).

Tôi đã tìm kiếm việc triển khai strtok và tôi đã tìm thấy các liên kết sau.

INFO:strtok ():C Hàm - Phần bổ sung Tài liệu - Mẫu mã trong liên kết này cho thấy rằng hàm không bỏ qua các ký tự phân cách liên tiếp.

Câu trả lời cho các câu hỏi SO sau đây chỉ ra rằng strtok hàm được thiết kế để bỏ qua các dấu phân cách liên tiếp.

Cần biết khi nào không có dữ liệu nào xuất hiện giữa hai dấu phân tách mã thông báo bằng strtok ()

hành vi strtok_s với các dấu phân cách liên tiếp

Tôi nghĩ rằng TOKENTOKENCOUNT các chức năng đang hoạt động theo thiết kế nhưng liệu đó có phải là cách SSIS hoạt động hay không có thể là một câu hỏi đối với nhóm Microsoft SSIS.

Bài đăng gốc - Phần trên là bản cập nhật:

Tôi đã tạo một gói đơn giản trong SSIS 2012 dựa trên dữ liệu đầu vào của bạn. Như bạn đã mô tả trong câu hỏi của mình, TOKEN chức năng không hoạt động như dự định. Tôi đồng ý với bạn rằng chức năng này dường như không hoạt động. Bài đăng này không một câu trả lời cho vấn đề ban đầu của bạn.

Đây là một cách thay thế để viết biểu thức theo cách tương đối đơn giản hơn. Điều này sẽ chỉ hoạt động nếu phân đoạn cuối cùng trong bản ghi đầu vào của bạn luôn có một giá trị (giả sử A1 , B2 , C3 v.v.).

Biểu thức có thể được viết lại thành :

Câu lệnh này sẽ nhận bản ghi đầu vào làm tham số, dấu mũ phân cách (^) làm tham số thứ hai. Tham số thứ ba tính tổng số phân đoạn trong các bản ghi khi được phân tách bởi dấu phân cách. Nếu bạn có dữ liệu trong phân đoạn cuối cùng, bạn được đảm bảo có hai phân đoạn. Sau đó, bạn có thể trừ 1 để lấy phân đoạn áp chót.

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

Tôi đã tạo một gói đơn giản với tác vụ luồng dữ liệu. Nguồn OLE DB truy xuất dữ liệu và phép chuyển đổi dẫn xuất phân tích cú pháp và phân tách dữ liệu theo ảnh chụp màn hình bên dưới. Đầu ra sau đó được chèn vào bảng đích. Bạn có thể thấy bảng nguồn và bảng đích trong ảnh chụp màn hình cuối cùng. Bảng đích có hai cột. Cột đầu tiên lưu trữ dữ liệu phân đoạn áp chót và số lượng phân đoạn dựa trên dấu phân cách (lại không đúng). Bạn có thể nhận thấy rằng bản ghi cuối cùng không tìm nạp kết quả chính xác. Nếu bản ghi cuối cùng không có giá trị 8 , thì biểu thức trên sẽ không thành công vì biểu thức sẽ đánh giá chỉ số bằng không.

Hy vọng điều đó sẽ giúp đơn giản hóa cách diễn đạt của bạn.

Nếu bạn không nhận được phản hồi từ bất kỳ ai khác, tôi khuyên bạn nên ghi lại vấn đề này trong trang web Microsoft Connect > .

Tạo bảng và điền tập lệnh :

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

Chuyển đổi cột có nguồn gốc bên trong tác vụ luồng dữ liệu :

Dữ liệu trong bảng nguồn và bảng đích :



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Các cách khác nhau để giám sát máy chủ SQL luôn có sẵn nhóm

  2. Tìm hiểu cách Thực hiện Phân tích Sản phẩm với Tìm kiếm Toàn văn của Máy chủ SQL. Phần 2

  3. hàm sql đệ quy với logic cuộn lên?

  4. SQL Server 2005 - Xuất bảng theo chương trình (chạy tệp .sql để xây dựng lại nó)

  5. Cần xuất các trường chứa dấu ngắt dòng dưới dạng CSV từ SQL Server