Hãy tưởng tượng một bảng với hàng trăm cột khác nhau trong đó. Hãy tưởng tượng, sau đó, rằng tôi có một bảng dữ liệu người dùng từ nơi tôi muốn sao chép dữ liệu vào bảng cơ sở. Vì vậy, tôi đã viết câu lệnh chèn-chọn đơn giản này và lỗi này bật lên. Vì vậy, cách thanh lịch nhất để tìm ra cột nào làm tăng lỗi?Làm thế nào để tìm ra cột nào làm tăng lỗi tràn số học khi chèn?
những suy nghĩ ban đầu của tôi về giải pháp là về gói nó trong một giao dịch mà tôi cuối cùng sẽ rollback và sử dụng một loại Divide và chinh phục cách tiếp cận:
begin tran
insert into BaseTable (c1,c2,c3,...,cN)
select c1,c2,c3,...,cN
from UserTable
rollback tran
Và điều này rõ ràng là thất bại. Vì vậy, chúng tôi chia cột được đặt thành một nửa như sau:
begin tran
insert into BaseTable (c1,c2,c3,...,cK) --where K = N/2
select c1,c2,c3,...,cK --where K = N/2
from UserTable
rollback tran
Và nếu không thành công thì cột bị lỗi nằm trong nửa còn lại. Và chúng tôi tiếp tục quá trình, cho đến khi chúng tôi tìm thấy cột pesky.
Mọi thứ thanh lịch hơn thế?
Lưu ý: Tôi cũng tìm thấy gần như trùng lặp với câu hỏi này nhưng nó hầu như không trả lời câu hỏi đó.
Nếu bạn phù hợp với kiểu dữ liệu của UserTable với BaseTable, chèn của bạn không có bất kỳ sự cố nào. Tất cả những gì cần thiết sau đó là tìm cột * UserTable * vi phạm. –
@Lieven Vâng, UserTable chỉ là ... một bảng người dùng không có hạn chế về nó, bởi vì dữ liệu trong đó là từ Excel hoặc Access hoặc không có gì. –
Tôi thông cảm. Nếu đây là một cái gì đó mà cần phải được thực hiện quy định, bạn không thể tạo một kịch bản/thủ tục lưu trữ kiểm tra đầu vào của bạn? Macro và một lựa chọn đơn giản sẽ đi một chặng đường dài, giống như 'SELECT' c1 ', CAST (c1) AS INTEGER FROM UserTable'. –