2012-07-19 26 views
9

Gần đây tôi đã gặp lỗi khi làm việc với bcp. Đây là lỗi.bcp: Lỗi = [Microsoft] [SQL Server Native Client 10.0] Dữ liệu chuỗi, cắt ngắn phải

SQLState = 22001, NativeError = 0 Lỗi = [Microsoft] [SQL Server khách hàng 10,0 Native] Chuỗi dữ liệu, cắt ngắn ngay

Tôi đang cố gắng để giải nén dữ liệu vào một bảng dàn mà không có bất kỳ ràng buộc nào và các kiểu dữ liệu cũng khá lớn khi so sánh với dữ liệu. Tôi có khoảng 11 tập tin từ các bảng khác nhau được bcp'd và nén ra trong đó chỉ có một tập tin khi giải nén lỗi ra. Đây là lệnh mà tôi đã sử dụng thành công. Rất gần đây (khi cố gắng tạo một bản sao của WH hiện tại và quyết định quá trình) Tôi đã gặp phải vấn đề.

bcp.exe employee_details trong employee_details.dat -n -E -S "servername" -U sa -P "Mật khẩu"

Tôi đã cố gắng thay đổi các lệnh để -c -T - S đã hoạt động khi tôi đưa định dạng theo cách thủ công. Đây là một gói rất lớn và quan trọng tôi cần phải tải vào WH của tôi.
Tôi không biết mình có thấy tệp định dạng ở đây hay không. Cần trợ giúp.

Cảm ơn

Cô gái quế.

+0

Bạn có thể cụ thể hơn không? "Khá lớn" nghĩa là gì? Bạn có thể hiển thị TẠO TẠO thực tế cho định nghĩa bảng và một vài mẫu dòng dài hơn từ tệp không? –

+0

Vâng Aaron, Xin lỗi vì không đủ rõ ràng. Tệp của tôi có thể nằm trong khoảng từ 1000 KB đến 800.000KB tùy thuộc vào lưu lượng truy cập hoặc giờ cao điểm. Bảng của tôi có các cột mẫu là epoch_time (bigint), server_id (varchar), uid_rl (int), apl (int) là các cột nhận dạng và một số cột khác được phân phối giữa int và float. Cảm ơn cô gái Quế –

+0

Tôi không yêu cầu xem toàn bộ tập tin, hoặc những thứ mơ hồ như 'varchar' -' varchar (cái gì) '? Đầu vào trông như thế nào? Bạn đang cho chúng tôi một thông báo lỗi mơ hồ cho biết bạn đang cố gắng nhồi nhét ít nhất một giá trị quá lớn cho cột của nó, nhưng bạn sẽ không cho chúng tôi biết định nghĩa bảng hoặc hiển thị cho chúng tôi dữ liệu gây ra nó? Bạn mong đợi chúng tôi giúp đỡ như thế nào? Có lẽ bạn có thể in ra tập tin của bạn, đặt nó trên một dartboard, và ném phi tiêu vào nó, và nó sẽ cho bạn thấy giá trị đó gây ra vấn đề? Đó là những gì bạn đang yêu cầu chúng tôi làm cho bạn. –

Trả lời

2

Lỗi cắt ngắn đúng bcp xảy ra khi có quá nhiều dữ liệu có thể được lắp vào một cột đơn. Điều này có thể do các tệp định dạng không đúng (nếu có) hoặc dấu phân tách. Trình kết thúc dòng (Windows có CRLF hoặc '\ r \ n' và UNIX có '\ n') cũng có thể gây ra lỗi này. Ví dụ Tệp định dạng của bạn chứa Windows CRLF nghĩa là '\ r \ n' làm trình kết thúc hàng nhưng tệp chứa '\ n' làm dòng kết thúc. Điều này có nghĩa là phù hợp với toàn bộ tập tin trong 1 hàng (thay vì 1 cột) dẫn đến lỗi cắt phải.

+0

Tôi thực sự không hiểu phân tích của bạn. Tuy nhiên, +1 cho dòng đề cập đến nguồn cấp dữ liệu. Đối với trường hợp của tôi, chúng tôi có các ký tự cấp dữ liệu dòng trong dữ liệu mà BCP thực sự không thích. – Richard

3

Đối với chúng tôi, hóa ra là tệp chúng tôi đang cố tải lên bằng Unicode thay vì định dạng ANSI.

Có nút chuyển đổi -N nhưng bảng của chúng tôi không có bất kỳ dữ liệu NVARCHAR nào.

Chúng tôi chỉ lưu file ở định dạng ANSI và nó làm việc, nhưng nếu bạn có dữ liệu NVARCHAR hoặc bạn có thể cần phải sử dụng công tắc -N

Xem TechNet - Using Unicode Native Format to Import or Export Data

+0

Tốt nhất! Tôi quản lý để nhập khẩu bằng cách sử dụng các tập tin csv lưu như ANSI ... Tuy nhiên vẫn nhận được một số lỗi cắt ngắn tại một số điểm của tập tin ... tôi cũng không thể loại bỏ các đóng gói quote kép trong khi sử dụng BCP .... bất kỳ ý tưởng? –

+0

@PauloHenrique Rất tiếc, tôi không có giải pháp. Bạn có thể thay đổi dấu phân cách sau đó xử lý trường trong bảng dàn dựng. Gần đây tôi vừa mới tải dữ liệu vào một .Net DataSet rồi chuyển nó thành User Type Table Type thành một proc được lưu trữ, nhưng điều đó không cho phép nó linh hoạt nhiều. Tôi cũng kết thúc trình tự tên kiểu khi kiểu thay đổi. Nó có liên quan nhiều hơn nhưng dễ khắc phục hơn. Đối với công cụ adhoc tôi chỉ cần tạo một chuỗi XML và sau đó phân tích cú pháp đó trong một proc được lưu trữ, nhưng đôi khi khó khắc phục nếu có nhiều chuyển đổi dữ liệu. –

0

mở các tập tin trong notepad ++. Chuyển đến Xem tab-> hiển thị ký hiệu-> hiển thị tất cả các ký tự. Tôi cũng phải đối mặt với cùng một vấn đề trong tab .tsv files.one đã bị thất lạc.

12

Chúng tôi cũng gặp phải sự cố tương tự khi thực hiện BCP và hóa ra đó là vấn đề với ký tự dòng mới trong tệp .dat.

Xem tệp trong Notepad ++ và nhấp vào "Hiển thị tất cả ký tự" để xem ký tự dòng mới.

File with LineFeed character

BCP ném lỗi sau với -r "\ r \ n" tùy chọn ví dụ:với bên dưới lệnh

bcp dbo.Test in C:\Test.dat -c -t "|" -r "\r\n" -S "DBServerName" -T -E 

"SQLState = 22001, NativeError = 0 Lỗi = [Microsoft] [SQL Server khách hàng 10,0 Native] Chuỗi dữ liệu, cắt ngắn đúng"

BCP đối xử với tất cả các hàng trong nộp như một hàng duy nhất với -r "\ n" hoặc -r tùy chọn "\ r" tức với bên dưới lệnh

bcp dbo.Test in C:\Test.dat -c -t "|" -r "\n" -S "DBServerName" -T -E 

Issue đã được giải quyết khi chúng ta sử dụng t giá trị ông Haxadecimal (0x0a) cho nhân vật New Line trong lệnh BCP

bcp dbo.Test in C:\Test.dat -c -t "|" -r "0x0a" -S "DBServerName" -T -E 
+0

csv của tôi được tạo ra trong Linux/PHP và có "LF" là trả về char, và sử dụng '-r" 0x0a "' làm việc cho tôi! –

+0

Tốt để biết nó đã giúp bạn .. Người !!! –

+0

@MayankJha Tệp của tôi không tải ngay cả với ký tự UNIX EOL nhưng nó hoạt động với giá trị thập lục phân cho ký tự dòng mới - rực rỡ – Ali

0

Tôi biết điều này là cũ - nhưng tôi chỉ tình cờ gặp một trường hợp mà tôi đã nhận được lỗi này, hóa ra một trong những trường số của tôi đã có nhiều số thập phân đã được lược đồ cho phép.

2

Tôi cũng nhận được thông báo cắt ngắn. Sau nhiều giờ tìm kiếm diễn đàn và thử các giải pháp được đề xuất, cuối cùng tôi cũng có được tải để làm việc.

Lý do cho thông báo cắt ngắn là do tôi đủ tin để đặt tên cột vào tệp định dạng thực sự quan trọng. Đó là số trước xuất hiện để chỉ ra nơi dữ liệu được tải.

Tệp nhập của tôi không có dữ liệu cho cột thứ ba trong bảng. Đây là cách định dạng tệp của tôi.

... "," 1 Cust_Name  SQL_Latin1... 
... "," 2 Cust_Ref  SQL_Latin1... 
... "," 3 Cust_Amount  SQL_Latin1... 
... "\r\n" 4 Cust_notes SQL_Latin1... 

tập tin đầu vào của tôi trông như thế này:

Jones,ABC123,200.67,New phone 
Smith,XYZ564,10.23,New SIM 

Bảng trông giống như

Cust_Name Varchar(20) 
Cust_Ref Varchar(10) 
Cust_Type Varchar(3) 
Cust_amount Decimal(10,2) 
Cust_Notes Varchar (50) 
Cust_Tel Varchar(15) 
Cust...... 

tôi đã giả định bằng cách cho tên cột trong file định dạng dữ liệu sẽ đi vào cột thích hợp trên bàn.

Điều này tuy nhiên hoạt động như số cột là quan trọng và tên cột là tiếng ồn.

... "," 1 A  SQL_Latin1... 
... "," 2 B  SQL_Latin1... 
... "," 4 C  SQL_Latin1... 
... "\r\n" 5 D  SQL_Latin1... 
Các vấn đề liên quan