2009-02-12 9 views
16

Khi một nguồn dữ liệu excel được sử dụng trong SSIS, các kiểu dữ liệu của mỗi cột riêng lẻ được lấy từ dữ liệu trong các cột. Có thể ghi đè hành vi này không? Lý tưởng nhất là chúng tôi muốn mỗi cột được phân phối từ nguồn excel là kiểu dữ liệu chuỗi, để xác thực dữ liệu có thể được thực hiện trên dữ liệu nhận được từ nguồn ở bước sau trong luồng dữ liệu.Nguồn dữ liệu SSIS Excel - Có thể ghi đè các kiểu dữ liệu cột không?

Hiện tại, tab Lỗi đầu ra có thể được sử dụng để bỏ qua lỗi chuyển đổi - dữ liệu được đề cập sau đó là rỗng và gói sẽ tiếp tục thực thi. Tuy nhiên, chúng tôi muốn biết dữ liệu gốc là gì để có thể tạo thông báo lỗi thích hợp cho hàng đó.

+0

Tôi đã trả lời một câu hỏi trong một chủ đề khác tương tự như của bạn, vui lòng tham khảo liên kết bên dưới. http://dba.stackexchange.com/questions/39252/ssis-keeps-force-changing-excel-source-string-to-float/149378#149378 – user1968485

Trả lời

8

Có, bạn có thể. Chỉ cần đi vào danh sách cột đầu ra trên nguồn Excel và đặt loại cho mỗi cột.

Để truy cập danh sách cột đầu vào, hãy nhấp chuột phải vào nguồn Excel, chọn 'Hiển thị Trình chỉnh sửa nâng cao', nhấp vào tab có nhãn 'Thuộc tính đầu vào và đầu ra'.

Giải pháp có khả năng tốt hơn là sử dụng thành phần cột có nguồn gốc nơi bạn có thể tạo cột "mới" cho mỗi cột trong Excel. Điều này có lợi ích của

  1. Bạn có quyền kiểm soát nhiều hơn đối với những gì bạn chuyển đổi.
  2. Bạn có thể đặt các quy tắc kiểm soát thay đổi (ví dụ: nếu null cung cấp cho tôi chuỗi trống, nhưng nếu có dữ liệu thì hãy cho tôi dữ liệu dưới dạng chuỗi)
  3. Nguồn dữ liệu của bạn không được liên kết trực tiếp với phần còn lại của quy trình (nghĩa là bạn có thể thay đổi nguồn và nơi duy nhất bạn sẽ cần thực hiện công việc là trong cột có nguồn gốc)
+0

Robert - Cảm ơn phản hồi của bạn - Tôi vẫn đang có vấn đề nhìn thấy làm thế nào để làm điều này. Tôi đang sử dụng thành phần Nguồn Excel có dạng cột, nhưng điều này chỉ có tên của mỗi cột, không phải kiểu dữ liệu. Trình quản lý kết nối Excel không có biểu mẫu cột như tôi thấy. –

+0

Tôi nghĩ rằng bạn đang đi đến trình soạn thảo tài sản sai (Excel nguồn có hai, một đơn giản và tiên tiến). Tôi đã cập nhật câu trả lời bằng cách làm rõ hơn một chút và từng bước để đến đúng nơi. –

+7

Bắt đầu ngay bây giờ - Tôi đã sử dụng trình chỉnh sửa nâng cao và đã thay đổi các cột đầu vào và đầu ra thành tất cả đều có kiểu dữ liệu DT_WSTR. Tuy nhiên dữ liệu cột đầu ra lỗi typs phải khớp với các kiểu dữ liệu cột đầu vào, và nó dường như không thể thay đổi chúng ... Cảm ơn sự giúp đỡ liên tục của bạn! –

7

Nếu tệp Excel của bạn chứa số trong cột được đề cập trong hàng dữ liệu đầu tiên, có vẻ như công cụ SSIS sẽ đặt lại kiểu thành kiểu số. Nó tiếp tục đặt lại của tôi. Tôi đã đi vào tệp Excel của tôi và thay đổi các con số thành "Số được lưu trữ dưới dạng văn bản" bằng cách đặt một dấu nháy đơn ở phía trước. Bây giờ chúng được đọc dưới dạng văn bản. Tôi cũng nhận thấy rằng SSIS sử dụng hàng đầu tiên để bỏ qua những gì lập trình viên đã chỉ ra là loại dữ liệu thực tế (tôi thậm chí đã nói với Excel định dạng toàn bộ cột là TEXT, nhưng SSIS vẫn sử dụng dữ liệu, đó là nhiều chữ số) và đặt lại. Khi tôi đã khắc phục điều đó bằng cách đặt một dấu nháy đơn trong tệp Excel của mình trước số trong hàng dữ liệu đầu tiên, tôi nghĩ nó sẽ làm đúng, nhưng không, có thêm công việc.

Thực tế, mặc dù Cột Nguồn dữ liệu ngoài SSIS hiện có loại DT_WSTR, nhưng vẫn sẽ đọc 43567192 là 4.35671E + 007. Vì vậy, bạn phải quay trở lại tệp Excel của bạn và đặt dấu nháy đơn ở phía trước tất cả các số.

Khá LAME, Microsoft! Nhưng có giải pháp của bạn. Tôi không biết phải làm gì nếu tệp Excel không nằm trong tầm kiểm soát của bạn.

-2

Bạn có thể sử dụng thành phần Chuyển đổi dữ liệu để chuyển đổi thành các loại dữ liệu mong muốn.

+2

Nếu SSIS, trong sự khôn ngoan vô hạn của nó, quyết định rằng một cột là số, đọc các giá trị văn bản sẽ làm cho nguồn dữ liệu thất bại. Không có cơ hội để chuyển đổi dữ liệu ở hạ lưu. –

-1

Tôi gặp sự cố khi triển khai giải pháp tại đây - Tôi có thể làm theo hướng dẫn nhưng chỉ đưa ra các lỗi mới.

Tôi đã giải quyết được sự cố chuyển đổi của mình bằng cách sử dụng thực thể Chuyển đổi dữ liệu. Điều này có thể được tìm thấy trên Hộp công cụ SSIS trong Chuyển đổi luồng dữ liệu.Tôi đã đặt Chuyển đổi Dữ liệu giữa Nguồn Excel và Điểm đến OLE DB của mình, liên kết Excel với Dữ liệu C, Dữ liệu C sang OLE DB, nhấp đúp vào Dữ liệu C để hiển thị danh sách các cột dữ liệu. Đã tạo cột sự cố một Bí danh mới và đã thay đổi cột Kiểu dữ liệu.

Cuối cùng, trong Ánh xạ của đích OLE DB, hãy sử dụng tên cột Bí danh, thay vì tên cột Excel ban đầu. Công việc hoàn thành.

+0

Dường như bạn quên liên kết đến giải pháp mà bạn tham chiếu – Ethan

+0

Đây là một sự giải thích đề xuất của Farouq từ hai năm trước và có cùng một vấn đề. –

+0

Vâng, đó là một công cụ xây dựng - để hiển thị tất cả các bước cần thiết để làm cho quy trình hoạt động - và nó đã hoạt động. Bạn đã thử nó trước khi quyết định rằng nó đã sai và cần bỏ phiếu xuống? – kangacHASHam

2

Nguồn Excel là SSIS hoạt động điên rồ. SSIS xác định loại dữ liệu trong một cột cụ thể bằng cách đọc 10 hàng đầu tiên .. do đó vấn đề. Nếu bạn có một cột văn bản có giá trị null trong 10 rãnh đầu tiên, SSIS lấy kiểu dữ liệu là Int. Với một chút đấu tranh, đây là giải pháp thay thế

  1. Chèn hàng giả (hàng đầu tiên thích hợp) vào trang tính. Tôi thích làm điều này thông qua một nhiệm vụ Script, bạn có thể xem xét sử dụng một số dịch vụ để xử lý trước các tập tin trước khi SSIS kết nối với nó

  2. Với hàng duummy, bạn chắc chắn rằng các kiểu dữ liệu sẽ được thiết lập như bạn cần

  3. Đọc dữ liệu bằng cách sử dụng nguồn Excel và lọc ra hàng giả trước khi bạn lấy nó để xử lý tiếp.

Tôi biết nó là một chút tồi tàn, nhưng nó hoạt động :)

0

tôi có thể khắc phục vấn đề này. trong khi tạo gói SSIS, tôi đã tự thay đổi cột cụ thể thành văn bản (Mở tệp excel chọn cột, nhấp chuột phải vào cột, chọn ô định dạng, trong tab số chọn Văn bản và lưu excel). Bây giờ hãy tạo gói SSIS và kiểm tra nó. Nó hoạt động. Bây giờ hãy thử sử dụng tệp excel nơi cột này không được đặt làm văn bản.

Nó làm việc cho tôi và tôi có thể thực hiện gói thành công.

8

Theo this blog post, vấn đề là người lái xe SSIS Excel xác định kiểu dữ liệu cho mỗi cột dựa trên các giá trị đọc của 8 hàng đầu tiên:

  • Nếu 8 hồ sơ đầu chứa số lượng tương đương của các loại số và ký tự - sau đó mức độ ưu tiên là số
  • Nếu phần lớn các bản ghi hàng đầu 8 là số thì nó chỉ định kiểu dữ liệu dưới dạng số và tất cả các giá trị ký tự được đọc dưới dạng số NULL
  • . loại ký tự thì nó gán kiểu dữ liệu như chuỗi và tất cả các giá trị số được đọc như NULLs

Các bài vạch ra hai điều bạn có thể làm gì để khắc phục điều này:

  1. Đầu tiên, thêm IMEX=1 đến hết chuỗi kết nối trình điều khiển Excel của bạn. Điều này sẽ cho phép Excel đọc các giá trị dưới dạng Unicode. Tuy nhiên, điều này là không đủ nếu dữ liệu trong 8 hàng đầu tiên là số.
  2. Trong sổ đăng ký, thay đổi giá trị cho HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Nod\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows thành 0. Điều này sẽ đảm bảo rằng trình điều khiển xem xét tất cả các hàng để xác định loại dữ liệu cho cột.
1

Tôi đang tìm giải pháp cho vấn đề tương tự nhưng không tìm thấy bất kỳ thứ gì trên internet. Mặc dù hầu hết các giải pháp tìm thấy đều hoạt động ở thời gian thiết kế, chúng không hoạt động khi bạn muốn tự động hóa gói SSIS của mình.

Tôi đã giải quyết vấn đề và làm cho nó hoạt động bằng cách thay đổi các thuộc tính của "Nguồn Excel". Theo mặc định, thuộc tính AccessMode được đặt thành OpenRowSet. Nếu bạn thay đổi nó thành SQL Command, bạn có thể viết SQL của riêng bạn để chuyển đổi bất kỳ cột nào bạn muốn.

Đối với tôi SSIS được điều trị cột NDCCode như float, nhưng tôi cần nó như là một chuỗi và vì vậy tôi sử dụng SQL sau:

Select [Site], Cstr([NDCCode]) as NDCCode From [Sheet1$] 

enter image description here

enter image description here

+0

Tôi đang upvoting vì lý thuyết giải pháp này có thể làm việc. Tôi đã thử nó nhưng Windows 8 + Visual Studio 2017 + BIDS mới nhất là bị rơi mỗi khi tôi nhận được đến một điểm nhất định với nó. Vì vậy, tôi không thể chắc chắn – EGP