2011-01-14 31 views
6

Vì vậy, tôi hiện đang làm việc trên di chuyển từ máy chủ cơ sở dữ liệu Advantage cũ sang SQL 2005 bằng SSIS 2008. Một trong các cột trong cơ sở dữ liệu Advantage cũ là kiểu MEMO. Theo mặc định, dịch này sẽ chuyển thành cột DT_TEXT. Trong cơ sở dữ liệu mới, tôi không cần nhiều lĩnh vực này, nhưng có thể giới hạn nó thành một thứ gì đó như VARCHAR (50). Tôi đã thiết lập thành công phép biến đổi cột có nguồn gốc để chuyển đổi điều này với biểu thức sau:SSIS ISNULL để trống chuỗi

(DT_STR,50,1252)[ColumnName] 

Bây giờ tôi muốn tiến thêm một bước và thay thế tất cả các giá trị NULL bằng một chuỗi rỗng. Điều này dường như dễ dàng, đủ sử dụng một biểu thức ISNULL([ColumnName])?"":(DT_STR,50,1252)[ColumnName], nhưng vấn đề là các Destination OLE DB chứa các lỗi sau

Không thể chuyển đổi giữa unicode và phi unicode dây ...

Vì vậy, rõ ràng là toàn bộ biểu thức ISNULL chuyển đổi kiểu dữ liệu thành chuỗi Unicode [DT-WSTR]. Tôi đã thử một loạt các phôi trên toàn bộ biểu thức hoặc các phần khác nhau, nhưng tôi không thể có được kiểu dữ liệu để phù hợp với những gì tôi cần.

Trước tiên, có thể chuyển đổi loại DT_TEXT trực tiếp thành unicode không? Từ những gì tôi có thể nói, các phôi không hoạt động theo cách đó. Nếu không, là có một cách để có được một biểu thức để làm việc để giá trị NULL được chuyển đổi thành chuỗi rỗng?

Cảm ơn sự giúp đỡ của bạn!

Trả lời

0

Tôi đã tìm ra điều gì đó hoạt động. Nó có thể không phải là giải pháp tốt nhất, nhưng nó sẽ làm việc cho tình hình của tôi.

Từ nguồn OLE DB của tôi, trước tiên tôi đã tạo cột có nguồn gốc. Điều này tôi đã sử dụng ISNULL mà kết thúc chuyển đổi nó thành một loại unicode DT_WSTR. mặc dù tôi không thể lấy bất kỳ phôi nào để đưa nó trở lại loại yêu cầu, sau đó tôi đã thêm một phép chuyển đổi Chuyển đổi Dữ liệu ở giữa Cột Có nguồn gốc và Đích đến OLE DB. Điều này sẽ lấy chuỗi đầu vào và chuyển đổi nó trở lại một DT_STR. Điều này tất cả cảm thấy một chút khó chịu chuyển đổi rất nhiều lần, nhưng cột không chứa bất kỳ thông tin sôi nổi mà tôi cần phải lo lắng về, vì vậy tôi cho rằng nó sẽ làm việc.

Cảm ơn tất cả những ai đã suy nghĩ về giải pháp, và nếu bạn tìm thấy một số cách tuyệt vời để giải quyết nó, tôi sẽ quan tâm hơn.

2

Hãy thử điều này trong cột có nguồn gốc của bạn.

(DT_STR,50,1252) (ISNULL(ColumnName) ? "" : (DT_STR,50,1252) ColumnName) 

Nó bao gồm một loại bổ sung đúc với điều kiện (? :) trong dấu ngoặc đơn để đảm bảo trình tự xử lý mong muốn. Tôi nghĩ rằng biểu thức ban đầu của bạn đã được đúc hoàn toàn đến DT_WSTR bởi vì "" mặc định là DT_WSTR. Với phiên bản mới này, bạn buộc cast vào DT_STR sau khi biểu thức được đánh giá.

+0

Tôi đã thử tính năng này trong nhiều lần thử. Tôi thậm chí đã đi xa như để làm điều này (DT_STR, 50,1252) (ISNULL (ColumnName)? (DT_STR, 1,1252) "": (DT_STR, 50,1252) ColumnName ... vẫn không có may mắn. Tôi đánh giá cao ý tưởng, và trừ khi tôi đã làm điều gì đó sai với việc đúc của tôi, nó đã kết thúc không hoạt động –