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 -i
tù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?
Tôi có thể chỉ định tệp sql đầu vào bằng bcp không?


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ự (...)

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

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ố:
- Tên tệp có truy vấn;
- 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 đỡ.

thử :
query=$( cat < /file.sql )
export query
bcp "${query}" queryout /home/file.csv

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

Đ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 file
tương đương với cat file
trong unix

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

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!

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

Có thể bạn quan tâm
