Helpex - Trao đổi & giúp đỡ Đăng nhập
18

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

18 hữu ích 5 bình luận 26k xem chia sẻ
7

Theo như tôi biết, 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 "CHỌN Tên TỪ AdventureWorks.Sales.Currency" truy vấn Currency.Name.dat -T -c

Theo tham chiếu của nó, tùy chọn "-i":

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

Lưu ý rằng nó khác với tùy chọn "-i" của Tiện ích sqlcmd :

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

7 hữu ích 3 bình luận chia sẻ
11

Tôi đã gặp sự cố này ngày hôm nay và đã tìm thấy một giải pháp thuận tiện, ít nhất là trong một tình huống đặ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 bảng tạm thời TOÀN CẦU.

Chỉ cần chạy truy vấn của bạn trong trình quản lý doanh nghiệp (hoặc cmd sql hoặc bất cứ thứ gì) bằng cách sử dụng SELECT ... INTO với một bảng tạm thời toàn cục, 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

SELECT * FROM ##mytemptable

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

DROP TABLE ##mytemptable
11 hữu ích 2 bình luận chia sẻ
9

Tôi đã làm theo cách khác để khắc phục điều đó.

Tôi tạo một tệp hàng loạt để đọc một tệp và gửi nội dung của bạn bằng 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

Tập lệnh đó nhận hai tham số:

  1. Tên tệp có truy vấn;
  2. Tên tệp cho dữ liệu xuất;

Thực thi một tập lệnh trong cmd như sau: export-query.bat query.sql export.txt

Tôi hy vọng đã được giúp đỡ.

9 hữu ích 0 bình luận chia sẻ
2

thử :

query=$( cat < /file.sql )
export query
bcp "${query}" queryout /home/file.csv
2 hữu ích 1 bình luận chia sẻ
1

Các truy vấn nhiều dòng có thể được cung cấp cho bcp một cách dễ dàng bằng cách sử dụng powershell:

PS> $query = @'
    select * 
    from <table>
'@
PS> bcp $query queryout <outfile> -d <database> -T -S <server> -c
1 hữu ích 0 bình luận chia sẻ
1

Điều thực sự hiệu quả với tôi là:

@ECHO off
setlocal enableextensions enabledelayedexpansion
SET "queryFile=%1"
SET "outFileName=%2"

SET RESULT=
FOR /F "delims=" %%i IN ('type %queryFile%') DO SET RESULT=!RESULT! %%i

echo %RESULT%

rem bcp "%RESULT%" queryout %outFileName% -t^ -r \n -T -k -c -d DB_NAME -S SERVER_NAME

type filetương đương với cat filetrong unix

1 hữu ích 0 bình luận chia sẻ
0

Tôi đã phải đối mặt với cùng một vấn đề, có thể không phải là một cách tiếp cận rất tốt. Tuy nhiên, tôi đã làm một cái gì đó như sau

bcp "declare @query nvarchar(max)  set @query = (SELECT * FROM OPENROWSET(BULK 'F:\tasks\report_v2.sql', SINGLE_CLOB) AS Contents) exec sp_executesql @query" queryout %outFileName%  /c /C RAW -S . -U sa -P 123 -d blog /T

Và tôi phải nói rằng, nếu bạn sử dụng như bảng tạm thời toàn cục thì bảng tạm thời toàn cục sẽ tự xóa sau khi truy vấn được thực thi. bạn không thể sử dụng cái này trong một số trường hợp

0 hữu ích 0 bình luận chia sẻ
0

Những gì tôi đã làm với các truy vấn phức tạp là tạo một thủ tục được lưu trữ với câu lệnh mong muốn và gọi nó từ BCP:

bcp "exec db.schema.stored_procedure" queryout "c:\file.txt" -T -S localhost -t "|" -c

Nó hiệu quả tuyệt vời đối với tôi. Lời chào hỏi!

0 hữu ích 0 bình luận chia sẻ
0

Tôi đã tạo tập lệnh của riêng mình (được gọi là bulk.sh) để làm điều này (không phải là tối ưu và không phải là phương pháp hay nhất ... Tập lệnh quá xấu, nhưng rất hữu ích).

#!/bin/bash
input="SQL_FILE.sql"
count=0
const=1000
lines=()
mkdir -p bulk
while IFS= read -r line
do
  lines+=("$line")
  count=$((count+1))
  check=$((count % const))
  if [[ $check -eq 0 ]]; then
     bulk="${lines[*]}"
     unset lines
     number=$(printf "%010d" $count)
     echo $bulk > "bulk/bulk${number}.sql"
     bulk=""
  fi
done < "$input"

FILES="bulk/*"
for f in $FILES
do
  echo "Processing $f file..."
  sqlcmd -S SERVER -d DATABASE -U USER -P "PASSWORD" -i "$f"
  sleep 2s
done

Bạn có thể thử nó, với:

$ docker run -v /path/to/your/sql/file/folder:/backup -it mcr.microsoft.com/mssql-tools
$ bash bulk.sh
0 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ sql sql server sql server 2008 bcp , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading