2012-03-21 73 views
8

Mỗi khi tôi cố gắng nhập tệp Excel vào SQL Server, tôi nhận được một lỗi cụ thể. Khi tôi cố gắng chỉnh sửa ánh xạ, giá trị mặc định cho tất cả các trường số là nổi. Không có trường nào trong bảng của tôi có số thập phân trong chúng và chúng không phải là loại dữ liệu tiền. Chúng chỉ có 8 chữ số. Tuy nhiên, vì tôi không muốn khóa chính của tôi được lưu trữ như một phao khi nó là một int, làm thế nào tôi có thể sửa lỗi này? Nó cho tôi một lỗi cắt ngắn của một số loại, tôi sẽ đăng một nắp màn hình nếu cần thiết. Đây có phải là một vấn đề phổ biến? Cần lưu ý rằng tôi không thể nhập các tệp Excel 2007 (tôi nghĩ rằng tôi đã tìm thấy biện pháp khắc phục cho điều này), nhưng ngay cả khi tôi cố gắng nhập các tệp .xls mọi giá trị chứa số được tự động nhập dưới dạng phao và khi tôi cố thay đổi nó, tôi gặp lỗi.Lỗi khi chuyển đổi kiểu dữ liệu khi nhập từ Excel sang SQL Server 2008

http://imgur.com/4204g

+0

Bạn đang sử dụng công cụ nào để nhập? SSIS? Và sẽ rất hữu ích khi biết chính xác "lỗi của một số loại" có nghĩa là gì. – Pondlife

+0

@ Pondlife, tôi đang sử dụng Trình hướng dẫn nhập trong SSMS. Liên kết đến lỗi đã được chỉnh sửa trong bài đăng gốc. – wootscootinboogie

Trả lời

9

SSIS không mặc nhiên chuyển đổi kiểu dữ liệu, vì vậy bạn cần phải làm điều đó một cách rõ ràng. Trình quản lý kết nối Excel chỉ có thể xử lý một vài kiểu dữ liệu và nó cố gắng đoán tốt nhất dựa trên một vài hàng đầu tiên của tệp. Đây là đầy đủ documented trong tài liệu SSIS.

Bạn có một vài lựa chọn:

  • Thay đổi kiểu dữ liệu đích để nổi
  • Load để một bảng 'dàn' với kiểu dữ liệu float sử dụng Wizard nhập và sau đó INSERT vào bảng đích thực sử dụng CAST hoặc CONVERT để chuyển đổi dữ liệu
  • Tạo một gói SSIS và sử dụng việc chuyển đổi Data Conversion để chuyển đổi dữ liệu

Bạn cũng có thể muốn lưu ý các nhận xét trong Import Wizard documentation về ánh xạ kiểu dữ liệu.

+0

Tôi đã nghĩ tôi phải làm một cái bàn 'dàn dựng'. Tôi không muốn nghĩ đến điều đó bởi vì tôi nghĩ đó là kludgey, nhưng nếu nó hoạt động, tôi đoán nó sẽ hoạt động. Cảm ơn! :) – wootscootinboogie

+0

Tôi đã thực hiện một bảng dàn dựng, nhưng tất cả các giá trị mà không chuyển đổi thành phao nổi đều được chuyển đổi thành NULL. – ulu

3

Khi Excel tìm thấy các kiểu dữ liệu hỗn hợp trong cùng cột, nó đoán định dạng đúng cho cột (phần lớn giá trị xác định loại cột) và loại bỏ tất cả các giá trị khác bằng cách chèn NULL. Nhưng Excel làm nó kém xa (ví dụ: nếu cột được coi là văn bản và Excel tìm số sau đó quyết định số đó là sai và chèn NULL thay thế hoặc nếu một số ô có chứa số là "văn bản" được định dạng, có thể nhận giá trị NULL vào một cột số nguyên của cơ sở dữ liệu).

Giải pháp:

  1. Tạo một mới nổi trội tấm với tên của các cột trong hàng đầu tiên
  2. Format các cột dưới dạng văn bản
  3. Dán các hàng mà không cần định dạng (sử dụng CVS định dạng hoặc sao chép/dán trong Notepad để chỉ nhận văn bản)

Lưu ý rằng định dạng cột trên một trang tính Excel hiện có là không đủ.

+0

Cùng một vấn đề với giải pháp của bạn, Nó sẽ lưu số dưới dạng VarChat, không hoạt động ... – mejiamanuel57

+1

Tất cả các giải pháp được cung cấp trên trang này yêu cầu phải thay đổi loại cột theo cách thủ công. Xin lỗi, tôi cho rằng bất cứ ai biết cách làm điều đó. Câu hỏi trên là làm thế nào để ngăn chặn các số nguyên trở nên nổi, bị cắt ngắn, vv, và cụ thể hơn để tránh thông báo lỗi này "Lỗi chuyển đổi kiểu dữ liệu". – derloopkat

+0

Sử dụng MSSQL 2012 và Office 15.0 điều này không có tác dụng đối với tôi. SSIS vẫn muốn chuyển đổi các cột thành float. – Lumberjack

7

Đi tắt của những gì Derloopkat nói, mà vẫn có thể thất bại trên chuyển đổi (không có hành vi phạm tội Derloopkat) vì Excel là khủng khiếp tại đây:

  1. Dán từ excel vào Notepad và lưu như bình thường (file .txt).
  2. Từ trong excel, hãy mở tệp .txt đã nói.
  3. Chọn tiếp theo vì nó rõ ràng là được phân cách bằng tab.
  4. Chọn "không" cho vòng loại văn bản, sau đó lại tiếp tục.
  5. Chọn hàng đầu tiên, giữ shift, chọn hàng cuối cùng và chọn nút radial văn bản. Nhấp vào Hoàn tất

Nó sẽ mở ra, kiểm tra để đảm bảo chính xác và sau đó lưu dưới dạng tệp excel.

+0

Với giải pháp của bạn Nó sẽ lưu số như một VarChat, mà không làm việc ... – mejiamanuel57

+1

câu trả lời của derloopkat để bình luận của bạn theo câu hỏi của ông tổng kết những suy nghĩ của tôi chính xác – JackArbiter

+0

Điều này đã không làm việc cho tôi. Trong SQL Server 2012 nó vẫn cố gắng chuyển đổi cột thành float. – Lumberjack

2

Có một giải pháp thay thế.

  1. Nhập bảng excel có số là phao (mặc định).
  2. Sau khi nhập khẩu, Chuyển đến Bảng-Thiết kế
  3. Thay đổi DataType của cột từ phao để Int hoặc bigint
  4. Save Changes
  5. Thay đổi DataType của cột từ bigint cho bất kỳ loại văn bản (Varchar, nvarchar, văn bản, ntext vv)
  6. Lưu thay đổi.

Vậy đó.

1

Dường như có một giải pháp đơn giản là thực sự khi xử lý các vấn đề về loại dữ liệu.

Về cơ bản, ở phần cuối của Excel chuỗi kết nối, thêm ;IMEX=1;"

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\YOURSERVER\shared\Client Projects\FOLDER\Data\FILE.xls;Extended Properties="EXCEL 8.0;HDR=YES;IMEX=1"; 

này sẽ giải quyết các vấn đề kiểu dữ liệu như cột nơi các giá trị được trộn lẫn với văn bản và số.

Để truy cập thuộc tính kết nối, hãy nhấp chuột phải vào trình quản lý kết nối Excel bên dưới luồng điều khiển và thuộc tính lần truy cập. Nó sẽ được bên phải theo giải pháp thám hiểm. Hy vọng rằng sẽ giúp.

+0

Ngay cả với IMEX = 1, giả sử trường của tôi là một trường chuỗi và cắt các chữ số có nghĩa trong các số. Ví dụ. số của tôi 987654321 trở thành 9.876543e + 008. Chuyển đổi những gì nó đã nhập trở lại một số lần nữa cho 9876543 ** 00 **, mất hai chữ số cuối cùng. Khả năng tương tác của Excel với dữ liệu thực tế là phá thai toàn phần. Tôi đang cố gắng để có được tất cả các khách hàng của tôi để loại bỏ Excel từ máy của họ, nhưng họ đang tất cả nghiện - phụ thuộc vào tinh thần sheeple. – DaveBoltman

+0

Thú vị. Vâng, Excel có thể rất trầm trọng với định dạng. https://munishbansal.wordpress.com/2009/12/15/importing-data-from-excel-having-mixed-data-types-in-a-column-ssis/ Đây là tài nguyên tốt nhất tôi đã tìm thấy về chủ đề này , và sẽ giúp bạn đối phó với số lượng lớn của bạn. Tôi đã không phải lộn xộn với những con số như thế này trước đây, vì vậy đó là một vấn đề mới đối với tôi. – SQLCodingIsFunnn

0

Một cách giải quyết phải xem xét trong một pinch:

  1. lưu một bản sao của tập tin excel, sửa đổi các cột để loại định dạng 'text'
  2. sao chép các giá trị cột và dán vào một trình soạn thảo văn bản, tiết kiệm tệp (gọi nó là tmp.txt).
  3. sửa đổi dữ liệu trong tệp văn bản để bắt đầu và kết thúc bằng một ký tự sao cho cơ chế nhập SQL Server sẽ nhận dạng dưới dạng văn bản. Nếu bạn có một trình soạn thảo ưa thích, hãy sử dụng các công cụ kèm theo. Tôi sử dụng awk trong Cygwin trên máy tính xách tay cửa sổ của tôi. Ví dụ: tôi bắt đầu kết thúc kết thúc giá trị cột với một dấu ngoặc đơn, như "$ awk '{print" \ x27 "$ 1" \ x27 "}' ./tmp.txt> ./tmp2.txt"
  4. sao chép và dán dữ liệu từ tmp2.txt lên trên cột cần thiết trong tệp excel và lưu tệp excel
  5. chạy nhập máy chủ sql cho tệp excel đã sửa đổi của bạn ... đảm bảo kiểm tra kỹ loại dữ liệu đã chọn bởi nhà nhập khẩu không phải là số ... nếu có, hãy lặp lại các bước trên với một bộ ký tự khác

Dữ liệu trong cơ sở dữ liệu sẽ có dấu ngoặc kép khi nhập xong ...bạn có thể cập nhật dữ liệu sau này để xóa dấu ngoặc kép hoặc sử dụng chức năng "thay thế" trong truy vấn đọc của bạn, chẳng hạn như "thay thế ([dbo]. [MyTable]. [MyColumn], '' '', '') "

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