Có cách nào để nói cột dẫn xuất không thành công?


7

Trong tác vụ dataflow SSIS, chúng tôi có một chuyển đổi cột dẫn xuất với khoảng 100 cột (về cơ bản chuyển đổi dữ liệu chuỗi đầu vào thô thành các biến được nhập). Khi nhiệm vụ này thất bại, liệu có cách nào để nói cột gây ra sự thất bại, để đăng nhập vào mục đích? Các lựa chọn thay thế khác mà tôi có thể nghĩ đến là một tác vụ tập lệnh tùy chỉnh để thực hiện từng chuyển đổi riêng lẻ (yuck) hoặc một chuyển đổi cột dẫn xuất riêng cho từng điểm dữ liệu (gấp đôi yuck).

Về cơ bản tôi chỉ muốn có thể định hướng lại các hàng thất bại và biết tại sao chúng thất bại.


Vì vậy, một ví dụ. Gói của chúng tôi đang được sử dụng để cho phép người dùng tải lên hàng loạt vào cơ sở dữ liệu của chúng tôi bằng bảng tính Excel. Vì vậy, giả sử bảng tính trải rộng trông như thế này (ngoại trừ có hàng trăm cột):

+--------+-----------------+---------+------------+---------+
| Text1  |     Number1     | Number2 | DateTime1  |  Text2  |
+--------+-----------------+---------+------------+---------+
| Spring | 1               |       1 | 1/1/0001   | Flowers |
| Summer | 2               |       2 | 6/1/2015   | Sweaty  |
| Fall   | N/A             |       3 | 10/31/2099 | Crunchy |
| Winter | This is garbage |       4 | 12/12/2020 | Icy     |
+--------+-----------------+---------+------------+---------+

Trong trường hợp này, chúng tôi muốn Mùa xuân, Mùa hè và Mùa thu thành công. Mùa thu có giá trị null cho Number1. Cột dẫn xuất sẽ có logic trông giống như thế này (không phải cú pháp hợp lệ, chỉ là logic)

sanitizedNumber1 = Number1 == "N/A" ? null : cast(Number1 as int)

Wintersẽ được chuyển hướng xuống đường dẫn lỗi và đăng nhập. Có cách nào để biết cột dẫn xuất không thành công? Một lần nữa, chúng ta có khoảng 100 đầu vào đang được xử lý trong chuyển đổi này theo cách tương tự. Tôi muốn có thể đăng nhập một cái gì đó như:

Bản ghi nhập "Mùa đông" không thành công do dữ liệu không hợp lệ trong "Number1"

Nó không nhất thiết phải là định dạng này, nhưng bất cứ điều gì cho phép người dùng có thể xác định duy nhất điểm dữ liệu xấu sẽ được chấp nhận. Tôi biết điều này có thể sử dụng thành phần tập lệnh và thực hiện chuyển đổi theo cách thủ công (đó là điều chúng tôi sẽ phải làm nếu không có tùy chọn nào tốt hơn) nhưng nếu có thể chỉ cần sửa đổi Chuyển đổi cột có nguồn gốc để cung cấp một cái gì đó dọc theo các dòng này Tôi muốn làm điều đó thay vì thực hiện lại toàn bộ thành phần trong một tập lệnh.


Dữ liệu này đến từ đâu? Bạn có thể không làm loại phôi của bạn trong nguồn?
Dave

Nó hơi phức tạp hơn thế. Nguồn là một bảng tính Excel, trong đó các giá trị có thể là giá trị sentinel dạng số hoặc chuỗi (nghĩ N / A hoặc NaN). Nếu một hàng có dữ liệu rác chúng tôi muốn loại bỏ hàng đó và đăng nhập thất bại chứ không phải là thất bại thành phần, nhưng chúng tôi muốn biết điểm dữ liệu là rác thay vì chỉ "có rác".
MikeTheLiar

Đây là những gì thuộc tính ErrorColumn dành cho. Mặc dù ánh xạ trở lại tên cột có vẻ khó hơn so với ...
Martin Smith

1
SQL Server 2016 cung cấp tên cột lỗi mssqltips.com/sqlservertip/4066/NH Chỉ một thời gian ngắn 11 năm sau khi sản phẩm được phát hành
billinkc

@bill hahaha, và chúng tôi mới nâng cấp từ 2008 đến 2012, vì vậy tôi sẽ mong muốn được sử dụng nó trong 6 hoặc 7 năm nức nở lặng lẽ
MikeTheLiar

Câu trả lời:


1

Bạn phải tự xác định những thất bại.

Chuyển hướng các hàng (như bạn hiện tại) vào một bảng khớp với các cột của bạn, với việc thêm một cột IDENTITY. Bảng này phải là tất cả các VARCHARloại dữ liệu, để bạn giữ lại tất cả các giá trị ban đầu.

Bây giờ bạn có thể xác định các lỗi của mình bằng TRY_CAST khi truy vấn bảng.

Ví dụ:

SELECT
Identity,
TRY_CAST(Winter As INT) As WinterConverted,
Winter
--------------------------------------
Identity  |  WinterConverted   | Winter
   1      |    NULL            | NaN

TRY_CAST không thể truyền giá trị trong Wintercột cho intbạn null. Bạn có thể làm điều này cho tất cả các cột.

Nếu nó đáng giá thời gian của bạn, bạn có thể thực hiện một truy vấn phức tạp hơn để trả về mỗi tên cột có chứa NULL. Nếu không, bạn sẽ có thể kiểm tra trực quan tương đối dễ dàng.

Tất nhiên, nếu hầu hết các lỗi của bạn là 'NaN' hoặc 'N / A', rất có thể bạn đang lãng phí thời gian để xác định các lỗi bạn đã biết. Dọn dẹp các vấn đề trước khi chúng trở thành một:

Winter == "NaN" || Winter == "N/A" ? -1 : (DT_I4)Winter

Là một lưu ý phụ, bạn có thể thêm một TRY_CASTđến 100 cột rất dễ dàng bằng cách sử dụng chỉnh sửa dọc: giữ Alt+ Shifttrong SSDT hoặc SSMS (một số ứng dụng khác) và sau đó hoặc sau đó chỉnh sửa hàng trăm dòng cùng một lúc.


Tôi nghĩ rằng tôi không hiểu câu trả lời này hoặc tôi đã không giải thích câu hỏi của tôi rất tốt. Tôi sẽ chỉnh sửa câu hỏi của mình với một chút thông tin.
MikeTheLiar

Tôi đã chỉnh sửa câu hỏi và thêm một ví dụ.
MikeTheLiar

0

Chỉnh sửa chuyển đổi Cột có nguồn gốc và nhấp vào [Configure Error Output...]nút ở dưới cùng của hộp thoại trình chỉnh sửa chuyển đổi.

Trong [Error]cột, chọn Chuyển hướng hàng từ danh sách thả xuống.

Bây giờ các hàng không thành công của bạn sẽ chuyển qua đầu ra lỗi của biến đổi (đường màu đỏ) - tùy thuộc vào cách bạn muốn ghi nhật ký các lỗi, bạn sẽ thêm Đích OLE DB hoặc Đích bản ghi hoặc bất cứ điều gì bạn muốn gửi các hàng không thành công.


Vâng, tôi biết rằng (đó là những gì chúng tôi đang làm bây giờ) - tuy nhiên điều đó không cho biết cột nào thất bại . Tất cả những gì tôi biết là hàng nào thất bại. Vì chúng tôi đang xử lý hàng trăm cột có khả năng tôi muốn có thể xác định phần dữ liệu cụ thể nào là xấu thay vì chỉ nói Row whatever has something bad in it. Check all 3784 columns and find it.
MikeTheLiar

Đồng ý. Chà, bài viết của bạn không chính xác rõ ràng về điều đó. Nếu thành phần cột dẫn xuất của bạn chỉ xử lý 1 cột, thì bạn biết cột nào bị lỗi. Nếu thành phần của bạn xác định 200 cột dẫn xuất và một cột không thành công, thì tùy chọn khác AFAIK của bạn là kiểm tra 200 cột dẫn xuất ở đâu đó trên đường dẫn lỗi, để thêm siêu dữ liệu trước khi bạn duy trì các hàng thất bại ở bất cứ đâu.
Mathieu Guindon
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.