2012-03-26 36 views
9

Tôi đang chạy một khá chuẩnTại sao không thể SQL Server cho tôi biết là cột gây ra lỗi

INSERT INTO [table] (col1, col2, ...coln) 
select * from #temp 

và tôi nhận được lỗi sau:

Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the varchar value 'NULL' to data type int.

Tôi hiểu lỗi, nhưng muốn biết tại sao cột gây ra vấn đề không được nhận dạng bởi thông báo lỗi. Có cách nào dễ dàng để tìm cột nào chứa null nghịch ngợm hay chỉ là một mưu đồ để làm cho tôi trông giống như tôi đang làm việc hiệu quả trong khi tôi thực sự chỉ dành 30 phút để xem một tập kết quả khổng lồ mà không đi đâu?

Chỉnh sửa: Cảm ơn các bạn đã giúp đỡ nhưng không ai thực sự trả lời câu hỏi. Do tất cả các RDBMS's spew ra thông báo lỗi tương tự là hoặc một số hữu ích hơn? 2012 của nó ... thử nghiệm và lỗi trên có thể hàng ngàn cột nên được chết!

+1

Thật khó chịu - đã đồng ý - nhưng không có cách nào để tìm thấy điều này, thực sự, ngoài thử nghiệm và lỗi. Trên bất kỳ cột nào mà bạn mong muốn là số, hãy thử sử dụng 'ISNUMERIC (columnName)' và xem bạn có nhận được bất kỳ giá trị không mong muốn nào của '0' –

+3

hay không. Tôi biết rằng, là một lập trình viên, tôi không kiếm được quyền cho các thông báo lỗi tốt hơn, bởi vì các thông báo lỗi của riêng tôi đều khó hiểu như nhau :) – dasblinkenlight

+4

@ brandy không liên quan ...Tôi đã đơn giản hóa nó cho ví dụ – woggles

Trả lời

4

Tôi sẽ xem xét cách bạn điền bảng tạm thời. Bạn dường như nhận được một giá trị của 'null' không NULL. Nếu dữ liệu này đến từ một tệp Excel, đây là một vấn đề phổ biến. Tôi thường clease dữ liệu đầu tiên bằng cách cập nhật theo cách này:

Update #temp 
set field1 = NULL 
where field1 = 'NULL' 

Nếu bạn muốn làm tất cả trong lệnh cập nhật cùng, sau đó

Update #temp 
set field1 = NULLIF(field1, 'NULL') 
, field2 = NULLIF(field2, 'NULL') 
, field3 = NULLIF(field3, 'NULL') 
+0

có cách nào nhanh chóng để thực hiện việc này cho tất cả các trường không? – woggles

+1

@ HLGEM: Bạn có một lỗi mà bạn đang cập nhật field3 đến field2. Ngoài ra tôi khuyên bạn nên sử dụng: ', field3 = NULLIF (field3, 'NULL')' –

1

Bạn sẽ không mất 30 phút để tìm ra vị trí trống. Bạn chỉ có rất nhiều cột. Chỉ cần bắt đầu chọn từ #temp WHERE col1 IS NULL, sau đó WHERE col2 là.

Nếu #temp có cột VARCHAR bạn đang cố gắng đưa vào trong cột INT thì hãy truyền nó. Nếu có NULL, bạn có thể muốn xử lý chúng với một CAST (ISNULL (VarCharColumn, '0') AS INT) hoặc một cái gì đó. Nếu một cột INT cho phép NULLS, thì chỉ cần cast đến INT là đủ (miễn là tất cả các giá trị là NULL hoặc int hợp lệ).

Nếu bạn viết INSERT của mình cẩn thận hơn một chút thì bạn sẽ có thể nhận được kết quả mong muốn.

+0

chỉ có quá nhiều cột là khoảng 150! Cuối cùng đã giải quyết nó ngay bây giờ để khoảng 1 tiếng rưỡi hoạt động của khỉ, bao gồm cả các lỗi sau đó. Tất cả các lỗi đã được xung quanh chèn 'null' s từ excel. – woggles

+0

@woggles Đó ... đó là một số lượng vô lý của các cột. Tôi rất vui vì tôi không làm việc trong lược đồ đó. Lời chia buồn của tôi. –

+0

cảm ơn! tiếc là số lượng cột trên mỗi bảng không phải là phần tồi tệ nhất của lược đồ! – woggles

0

Bạn sẽ cần một số thử và sai như @ Jeremy chỉ ra. Nhưng bạn có thể thắng những lựa chọn.

Thông báo lỗi cho biết rằng sự cố là NULL trong cột VARCHAR. Bạn có thể giới hạn tìm kiếm của mình chỉ với các cột VARCHAR trong #temp: select * from #temp where col1 is null or col3 is null

Thứ hai, sự cố cũng xảy ra khi công cụ cơ sở dữ liệu cố gắng chuyển đổi giá trị giá trị rỗng thành integer not null. So sánh các định nghĩa của cả hai bảng để xem nơi một varchar trong #temp khớp với một số integer not null trong bảng khác.

Điều này, tuy nhiên, là đáng ngờ. Tại sao bạn đang cố chuyển đổi văn bản thành các số? Nếu đó là những gì bạn thực sự muốn làm, bạn có thể sẽ cần một diễn viên rõ ràng từ văn bản đến số.

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