2008-08-28 28 views
5

Đây là cơ sở dữ liệu sql 2000 mà tôi đang làm việc.SQL 2000 'TRY CATCH như' Xử lý lỗi

Tôi có cái mà tôi gọi là bảng dàn dựng là một vùng dữ liệu thô của dữ liệu, vì vậy mọi thứ đều là ntext hoặc nvarchar (255).

tôi cần phải đúc/chuyển đổi tất cả các dữ liệu này vào các kiểu dữ liệu thích hợp (ví dụ int, số thập phân, nvarchar, vv)

Con đường tôi đã đi để làm điều này là để lặp qua tất cả hồ sơ sử dụng một trong khi vòng lặp và cố gắng một CAST trên mỗi cột trên một bản ghi duy nhất trong mỗi lần lặp, sau khi tôi truy cập một bản ghi cụ thể, tôi gắn cờ nó là trường bit (đã xử lý).

Nhưng làm cách nào tôi có thể ghi lại lỗi khi/nếu điều đó xảy ra nhưng cho phép vòng lặp while tiếp tục. Lúc đầu, tôi đã thực hiện điều này bằng cách sử dụng TRY CATCH trong một trường hợp SQL 2005 (để dự án đi) và tất cả đều hoạt động tốt, nhưng hôm nay tôi đã học được rằng cơ sở dữ liệu sản xuất dev & mà DBA quốc tế đã thiết lập một phiên bản SQL 2000 vì vậy tôi phải tuân theo.

EDIT: Tôi đang sử dụng gói SSIS để điền bảng dàn dựng. Tôi thấy rằng bây giờ tôi phải xem lại gói đó và thực hiện một thành phần kịch bản để xử lý các chuyển đổi. Thanks guys

EDIT: Tôi am làm điều này trên một kỷ lục của cơ sở hồ sơ, không phải là một chèn hàng loạt, vì vậy ý ​​tưởng giao dịch có vẻ như nó sẽ là khả thi nhưng tôi không chắc chắn làm thế nào để bẫy @@ ERROR và cho phép quy trình được lưu trữ tiếp tục.

EDIT: Tôi thực sự thích Guy's approach, tôi sẽ triển khai theo cách này.

Trả lời

2

Nói chung tôi không thích "lặp qua các kỷ lục" giải pháp như họ có xu hướng chậm và bạn sẽ chỉ viết rất nhiều mã tùy chỉnh.

Vậy ...

Tùy thuộc vào có bao nhiêu record trong bảng dàn của bạn, bạn có thể gửi dữ liệu quá trình này với một loạt các câu lệnh SQL mà kiểm tra các cột cho đúng đắn và đánh dấu bất kỳ hồ sơ mà không kiểm tra.

ví dụ:

UPDATE staging_table 
SET status_code = 'FAIL_TEST_1' 
WHERE status_code IS NULL 
AND ISDATE(ntext_column1) = 0; 

UPDATE staging_table 
SET status_code = 'FAIL_TEST_2' 
WHERE status_code IS NULL 
AND ISNUMERIC(ntext_column2) = 0; 

etc... 

Cuối cùng

INSERT INTO results_table (mydate, myprice) 
SELECT ntext_column1 AS mydate, ntext_column2 AS myprice 
FROM staging_table 
WHERE status_code IS NULL; 

DELETE FROM staging_table 
WHERE status_code IS NULL; 

Và bảng dàn có tất cả các lỗi, mà bạn có thể xuất và báo cáo ra.

2

Bạn đang sử dụng gì để nhập tệp? DTS có khả năng viết kịch bản có thể được sử dụng để xác thực dữ liệu. Nếu bạn không sử dụng DTS, bạn có đang sử dụng một công cụ tùy chỉnh không? Nếu có thì xác thực của bạn ở đó.

Nhưng tôi nghĩ đây là những gì bạn đang tìm kiếm.
http://www.sqlteam.com/article/using-dts-to-automate-a-data-import-process

IF @@Error <> 0 
GOTO LABEL 

@op
Trong SSIS các "đường đỏ" từ một công việc nhập dữ liệu có thể chuyển hướng hàng xấu đến một đích riêng hoặc chuyển đổi. Tôi đã không chơi với nó trong một thời gian nhưng hy vọng nó sẽ giúp.

1

Có vẻ như bạn đang phải chịu số phận. Xem tài liệu this.

TL/DR: Lỗi chuyển đổi dữ liệu luôn làm cho toàn bộ lô bị hủy bỏ - tập lệnh sql của bạn sẽ không tiếp tục thực hiện bất kể bạn làm gì. Giao dịch sẽ không giúp ích gì. Bạn không thể kiểm tra @@ ERROR vì việc thực hiện đã bị hủy bỏ.

Lần đầu tiên tôi sẽ xem xét lại lý do tại sao bạn cần một cơ sở dữ liệu dàn dựng đầy đủ các cột varchar (255) - có thể điền vào bất kỳ cơ sở dữ liệu nào để thực hiện chuyển đổi không?

Nếu không, tôi đoán bạn sẽ cần phải viết một chương trình/tập lệnh để chọn từ các cột VARCHAR, chuyển đổi và chèn vào db sản.

1

Chạy mỗi diễn viên trong một giao dịch, sau mỗi lần truyền, hãy kiểm tra @@ ERROR, nếu nó rõ ràng, cam kết và tiếp tục.

1

Bạn có thể thử kiểm tra loại dữ liệu trước khi truyền và thực sự tránh phát hiện lỗi.

Bạn có thể sử dụng các chức năng như:

 
ISNUM - to check if the data is of a numeric type 
ISDATE - to check if it can be cast to DATETIME

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