Chuyển đổi chuỗi Non Unicode sang chuỗi Unicode SSIS


9

Tôi đang tạo một gói trong đó tôi sẽ xuất dữ liệu từ cơ sở dữ liệu sang tệp excel trống. Khi tôi chỉ thêm các thành phần nguồn và đích và tôi đã chạy gói, tôi gặp lỗi chuyển đổi cho biết cột Đầu ra và cột "A" không thể chuyển đổi giữa các loại dữ liệu chuỗi unicode và không unicode.

Để khắc phục điều này, tôi đã thêm một thành phần chuyển đổi dữ liệu và chuyển đổi tất cả các cột thành

"Chuỗi Unicode [DT_WSTR]"

và tôi không còn nhận được lỗi. Vấn đề duy nhất là tôi có khoảng 50 cột trong đó tôi phải đi từng cột 1 và chọn "Chuỗi Unicode [DT_WSTR]" từ danh sách thả xuống. Sau đó tôi đã phải đi vào thành phần đích và ánh xạ các cột mới được chuyển đổi vào tệp excel của tôi.

Câu hỏi của tôi là, nếu có ai khác gặp phải vấn đề này, có cách nào hiệu quả hơn để giải quyết việc phải thực hiện tất cả các chuyển đổi loại dữ liệu thủ công không? Phải chuyển đổi và ánh xạ tất cả các cột từng cái một dường như không thực tế, đặc biệt nếu bạn có một số lượng lớn các hàng.

Tôi hiểu các tệp excel không phải là cách tốt nhất để nhập và xuất dữ liệu nhưng đó là những gì được yêu cầu trong trường hợp cụ thể này.

Tôi có thể tìm cách chỉ xuất sang tệp văn bản phẳng và sau đó thử chuyển đổi sang excel như bước cuối cùng trong gói. Tôi hy vọng điều này sẽ không gây ra lỗi chuyển đổi unicode / nonunicode tương tự.


Làm thế nào là syndrom ống cổ tay của bạn sau đó? :-)
Patrick Honorez

Đảm bảo bảng bạn di chuyển dữ liệu đang sử dụng các loại dữ liệu Unicode (ví dụ: nvarchar (50) thay vì varchar (50))
MacGyver

Câu trả lời:


15

Thay thế cho RDC, tôi chỉ cần bỏ qua việc chuyển đổi các loại dữ liệu trong SSIS và chuyển chúng rõ ràng thành nvarchar trong truy vấn nguồn của tôi.

Sử dụng

Trong truy vấn nguồn của bạn (và bạn đang sử dụng truy vấn nguồn và không chỉ đơn giản là chọn bảng trong trình đơn thả xuống), hãy chuyển mọi thứ thành một độ dài char (n) thích hợp.

Thay vì

SELECT
    E.BusinessEntityID
,   E.NationalIDNumber
,   E.LoginID
,   E.JobTitle
,   E.BirthDate
,   E.MaritalStatus
,   E.Gender
FROM
    HumanResources.Employee AS E

sử dụng một truy vấn như

SELECT
    CAST(E.BusinessEntityID AS nvarchar(10)) AS BusinessEntityID
,   CAST(E.NationalIDNumber AS nvarchar(15)) AS NationalIDNumber
,   CAST(E.LoginID AS nvarchar(256)) AS LoginID
,   CAST(E.JobTitle AS nvarchar(50)) AS JobTitle
,   CAST(E.BirthDate AS nvarchar(10)) AS BirthDate
,   CAST(E.MaritalStatus AS nchar(1)) AS MaritalStatus
,   CAST(E.Gender AS nchar(1)) AS Gender
FROM
    HumanResources.Employee AS E

Các sinh viên sắc sảo của AdventureWorks sẽ nhận ra dữ liệu đã là một n(var)charloại nhưng đây chỉ đơn thuần là để thể hiện khái niệm này.

Những lợi ích

  • Bộ nhớ sử dụng ít hơn. Hiện tại, bạn đang phân bổ và lưu trữ hai bản sao của dữ liệu "giống nhau" bằng cách sử dụng Data Conversion Componenttrong SSIS
  • Không có chỉ số RSI . Không cần phải bấm N lần và chỉ định tất cả thông tin đó trong trình chỉnh sửa nhỏ khủng khiếp mà họ cung cấp. Tôi sẽ sử dụng truy vấn đối với dmv / information_schema để tự động hóa thêm việc tạo bảng xuất "sẵn sàng cho Excel".
  • Không có cài đặt thành phần tùy chỉnh. Tôi đã làm việc ở những nơi cài đặt mã nguồn mở là verboten. Ngoài ra còn có chi phí bảo trì trì hoãn để cài đặt ứng dụng của bên thứ ba vì hiện tại "mọi người" cần cài đặt cùng ứng dụng đó để duy trì mã của bạn nó cần được cài đặt trên các máy chủ infosec cần xem xét kỹ lưỡng các hội đồng để đảm bảo chúng hợp lệ chúng tôi cần đăng nhập từ một người có số tiền vượt trội hơn bạn ...

1
"Thay thế cho RDC" - RDC là gì? Khi tôi đọc câu trả lời tiếp theo, tôi nghĩ bạn có thể có nghĩa là Thay thế Thành phần dữ liệu, nhưng vì tác giả của bài viết gốc không đề cập đến thành phần đó, có thể là quá sớm cho một từ viết tắt. :-)
Thronk

nói về RSI, CONVERTnên dễ dàng dán hơn 50 lần so với CAST, vì các đối số ở phía trước
Patrick Honorez


2

Nếu bạn chỉ phải thay đổi từ "chuỗi Unicode (DT_WSTR)" thành "chuỗi (DT_STR)" hoặc ngược lại, thì bạn có thể làm điều này:

  1. Lưu một bản sao của gói pack.dtsx- (trong trường hợp bạn phải khôi phục)
  2. Mở gói.dtsx trong trình chỉnh sửa hoặc trong MS Visual Studio nhấp chuột phải vào gói và chọn "Xem mã". Bạn sẽ thấy một tệp XML.

Tìm kiếm chuỗi DTS:DataTypenếu được theo sau bởi = "130", thì Cột được xác định là DT_WSTR (unicode).

Nếu nó được theo sau bởi = "129", thì Cột được xác định là DT_STR (không phải là unicode), sử dụng tìm kiếm và thay thế một cách cẩn thận (bạn đã tạo một bản sao trước đó, phải không?)

Lưu tập tin và có lẽ đây là nó.


1
Chào mừng bạn đến với DBA SE! Mẹo chuyên nghiệp: trang web có các tính năng định dạng văn bản khác nhau để làm cho bài đăng của bạn đẹp hơn. Sử dụng các biểu tượng trên đầu của hộp văn bản soạn thảo.
peterh - Phục hồi Monica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.