2015-05-05 15 views
7

Tôi đang cố tải một tệp phẳng vào SQL Server qua tác vụ Luồng dữ liệu SSIS. Theo như các tập tin, tôi nhận được cột trong hình dạng này 20140311115000, Nếu tôi bật Fast Parse: False tôi có thể lấy cột để nhập nếu tôi thay đổi cột thành 2014-03-11 11:50:00. Đây không phải là tối ưu mặc dù tôi không có quyền kiểm soát các tệp ngược dòng mà chúng tôi đã cung cấp và tôi không muốn phân tích cú pháp mỗi cột/hàng/bảng. Trong kết nối tệp của tôi, tôi có cột được định nghĩa là: DT_DBTIMESTAMP2. Ở định dạng ngưng tụ, tôi nhận được lỗi sau:SSIS Dataflow CSV sang SQL Server với cột DateTime2

[ADO NET Destination [2]] Error: System.ArgumentOutOfRangeException: 
Year, Month, and Day parameters describe an un-representable DateTime. 
at System.DateTime.DateToTicks(Int32 year, Int32 month, Int32 day)...` 

Có cách nào để làm cho định dạng cột ngắn hơn (20140311115000) nhập chính xác không?

+1

Bạn biết những gì thực sự tuyệt vời về điều này là năm 2008 SSIS không thất bại. Tôi nhận được rằng [thông báo lỗi jacked trong chính cột] (http://i.stack.imgur.com/ZKi73.png) – billinkc

+0

Nếu bạn có thể thuyết phục các nhà cung cấp ngược dòng của mình sửa đổi giá trị thành '20140311T115000' thì hãy thiết lập FastParse = đúng cho các cột đó sẽ cho phép nó nhập nguyên bản dưới dạng DT_DBTIMESTAMP2 – billinkc

+0

Cảm ơn tùy chọn đó @billinkc; Đó là một chút ít quyết liệt hơn so với hình dạng khác tôi biết rằng Fast Parse cũng sẽ xử lý: '2014-03-11 11: 50: 00' –

Trả lời

5

Để mở rộng nhận xét của tôi vì đây dường như là câu trả lời có thể chấp nhận được:

Tôi sẽ xử lý điều này trong SSIS với cột có nguồn gốc. Nó có một vài ưu điểm chính: đầu tiên, nó sử dụng cùng một phương pháp phân tích cú pháp như phần còn lại của quá trình nhập của bạn để bạn không phải lo lắng về việc phân tích các trường; thứ hai, tất cả được thực hiện trong bộ nhớ, do đó bạn không ghi dữ liệu của mình vào đĩa hai lần; thứ ba, đó là SSIS làm việc chuyển đổi và không phải là công cụ SQL Server, do đó, nó sẽ không bị tranh chấp tài nguyên (đặc biệt là nếu SSIS của bạn là trên một máy chủ khác); bốn, Derived Columns use synchronous stream processing, tức là nhanh như vậy.

Cách tôi làm điều này là xác định trường trong tệp CSV dưới dạng chuỗi (DT_STR) chiều dài 14. Tôi có xu hướng đổi tên cột đầu vào của CSV "{SourceColumn} _STR" hoặc "{SourceColumn} _RAW ", bởi vì bạn cần phải có tên cột đầu vào và đầu ra duy nhất và điều này cho phép tôi sử dụng" {SourceColumn} "sau này cho tên của cột có nguồn gốc. Điều đó làm cho việc ánh xạ đích đến dễ dàng hơn một chút, IMO. Nếu bạn không thay đổi kiểu dữ liệu, bạn có thể lấy đi bằng cách thay thế cột, nhưng nếu bạn thay đổi kiểu dữ liệu, bạn cũng phải đặt tên cột mới là AFAIK.

Vì vậy, tiếp theo bạn tạo Nguồn dữ liệu tệp phẳng như bình thường trong Task Flow Data. Tiếp theo, thêm vào một biến đổi cột có nguồn gốc. Chỉnh sửa đổi, cung cấp cho các cột mới một tên "{SourceColumn}", cấu hình nó để Thêm vào làm cột mới, và định dạng chuỗi và gõ đúc nó với một biểu hiện như:

(DT_DBTIMESTAMP2, 2)(SUBSTRING(MyDateColumn,1,4) + "-" + SUBSTRING(MyDateColumn,5,2) + "-" + SUBSTRING(MyDateColumn,7,2) + " " + SUBSTRING(MyDateColumn,9,2) + ":" + SUBSTRING(MyDateColumn,11,2) + ":" + SUBSTRING(MyDateColumn,13,2)) 

tôi có xu hướng sử dụng các định dạng từ the TechNet wiki page for SSIS expressions và từ the SSIS doc for Casting đơn giản chỉ vì các kiểu dữ liệu SSIS khác với kiểu dữ liệu SQL Server mặc dù chúng ánh xạ rõ ràng. DT_GUID ví dụ, yêu cầu dấu ngoặc nhọn trong khi UNIQUEIDENTIFIER thì không.

Điều này thực hiện rất tốt, theo kinh nghiệm của tôi. Việc nhập khẩu duy nhất tôi đã có hiện đang sử dụng phương pháp này ngay bây giờ là khá nhỏ chạy trên phần cứng khá vừa phải. Nó chỉ nhập khoảng 12.000 bản ghi, nhưng mỗi bản ghi là khoảng 4KB và có ~ 240 trường và nó chuyển đổi sáu hoặc bảy bản ghi. Hầu hết trong số họ đang chuyển chuỗi thành DT_GUIDs bằng cách thêm dấu gạch ngang và dấu ngoặc nhọn, nhưng một trong số đó là sửa các ngày không đúng định dạng tương tự như thế này. Toàn bộ quá trình bao gồm ghi dữ liệu mất từ ​​1 đến 2 giây.

Các vấn đề liên quan