2012-05-13 15 views
9

Làm cách nào để chỉ định tệp sql đầu vào có truy vấn dài khi sử dụng bcp? Tôi đã thử sử dụng tùy chọn -i nhưng nó vẫn phàn nàn về lỗi dòng lệnh mà không có thêm thông tin. Điều này có thể không?Tôi có thể chỉ định tệp sql đầu vào với bcp không?

+0

Nhập tệp SQL? Không. Bạn có thể chỉ định tệp dữ liệu và tệp định dạng. Nếu bạn muốn sử dụng SQL, có lẽ chèn số lượng lớn là một lựa chọn tốt hơn. –

+0

@GordonLinoff: Trên thực tế, tôi đang cố gắng lấy dữ liệu từ một bảng. Trước đó, tôi đã làm một SELECT dựa trên một chuỗi và cung cấp nó cho bcp nhưng bây giờ tôi có một truy vấn dài hơn. – Legend

+0

Bạn có thể tạo chế độ xem có truy vấn. –

Trả lời

3

Theo như tôi lo ngại, tiện ích BCP chỉ hỗ trợ các truy vấn Transact-SQL được ghi trực tiếp vào dòng lệnh. Ví dụ:

BCP "SELECT Tên TỪ AdventureWorks.Sales.Currency" queryout Currency.Name.dat -T -c

Theo its reference các "-i" tùy chọn:

Chỉ định tên của tệp phản hồi, chứa câu trả lời cho câu hỏi dấu nhắc lệnh cho mỗi trường dữ liệu khi bản sao số lượng lớn đang được thực hiện bằng chế độ tương tác (-n, -c, -w hoặc -N không được chỉ định).

Chú ý rằng nó khác với các tùy chọn sqlcmd Utility "-i":

Xác định các tập tin có chứa một loạt các câu lệnh SQL hoặc thủ tục lưu trữ. Nhiều tệp có thể được chỉ định sẽ được đọc và xử lý theo thứ tự (...)

+0

+1 Cảm ơn bạn. Bạn có biết phải làm gì khi lệnh 'SELECT' quá dài? – Legend

+0

Tôi không bao giờ phải tự sử dụng các truy vấn dài, nhưng kết quả tìm kiếm nhanh của Google trong liên kết này có thể hữu ích cho bạn: [FIX: Bcp.exe với Chuỗi Truy vấn Dài có thể dẫn đến lỗi xác nhận] (http://support.microsoft) .com/kb/279180) –

+2

Khi tôi đã chạy vào BCP các truy vấn quá dài, chúng tôi đã sử dụng để lưu trữ lượt xem trên nguồn. Truy vấn BCP của chúng tôi có thể chỉ đơn giản là "chọn x, y, z từ [VIEW]" –

6

Tôi đã gặp sự cố này ngày hôm nay và đã tìm được cách giải quyết thuận tiện, ít nhất trong trường hợp đặc biệt.

Bảng tạm thời có thể được tạo bởi bất kỳ người dùng nào có quyền kết nối. Điều này có nghĩa là bạn cũng có thể tạo các bảng tạm thời GLOBAL.

Chỉ cần chạy truy vấn của bạn trong trình quản lý doanh nghiệp (hoặc sql cmd hoặc bất kỳ thứ gì) bằng cách sử dụng SELECT ... INTO với bảng tạm thời toàn cầu, ví dụ:

SELECT * 
INTO ##mytemptable 
FROM SomeTable 
WHERE [massive where clause, for example] 

Sau đó bạn có thể sử dụng bảng tạm thời trong truy vấn BCP với một đơn giản

SELECT * FROM ##mytemptable 

Sau đó thả các bảng tạm thời thông qua quản lý doanh nghiệp

DROP TABLE ##mytemptable 
+2

Hoặc bao giờ chỉ 'bcp ## mytemptable out' ... – Neil

2

tôi đã làm cách nào khác cho sửa chữa mà .

Tôi tạo tệp hàng loạt có đọc tệp và gửi nội dung của bạn theo lệnh bcp. Xem:

@ECHO off 

SETLOCAL EnableDelayedExpansion 

SET queryFile=%1 
SET outFileName=%2 

FOR /F "delims=" %%i IN (%queryFile%) DO SET join=!join! %%i 

ECHO %join% 

bcp "%join%" queryout %outFileName% /S.\SQLE_CAESAR /d /c /t"|" /T 

kịch bản đó nhận được hai thông số:

  1. Tên tập tin trong đó có một truy vấn;
  2. Tên tệp cho dữ liệu xuất;

Thực hiện một kịch bản trong cmd như thế: xuất query.bat query.sql export.txt

Tôi hy vọng giúp đỡ.

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