使用 bcp 时如何指定带有长查询的输入 sql 文件?我尝试使用该-i
选项,但它一直抱怨没有额外信息的命令行错误。这可能吗?
9 回答
我今天遇到了这个问题,并找到了一个方便的解决方法,至少在临时情况下是这样。
任何具有连接权限的用户都可以创建临时表。这意味着您还可以创建 GLOBAL 临时表。
只需使用带有全局临时表的 SELECT ...INTO 在企业管理器(或 sql cmd 或其他)中运行您的查询,例如
SELECT *
INTO ##mytemptable
FROM SomeTable
WHERE [massive where clause, for example]
然后,您可以在 BCP 查询中使用一个简单的临时表
SELECT * FROM ##mytemptable
然后通过企业管理器删除临时表
DROP TABLE ##mytemptable
我做了其他方法来解决这个问题。
我创建了一个批处理文件,它读取文件并在bcp命令中发送您的内容。看:
@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
该脚本接收两个参数:
- 有查询的文件名;
- 导出数据的文件名;
像这样在 cmd 中执行脚本: export-query.bat query.sql export.txt
我希望有所帮助。
就我而言,BCP 实用程序仅支持直接写入命令行的 Transact-SQL 查询。前任:
bcp "SELECT Name FROM AdventureWorks.Sales.Currency" queryout Currency.Name.dat -T -c
根据其参考“-i”选项:
指定响应文件的名称,其中包含在使用交互模式(未指定 -n、-c、-w 或 -N)执行大容量复制时对每个数据字段的命令提示问题的响应。
请注意,它与sqlcmd 实用程序“-i”选项不同:
标识包含一批 SQL 语句或存储过程的文件。可以指定将按顺序读取和处理的多个文件 (...)
尝试 :
query=$( cat < /file.sql )
export query
bcp "${query}" queryout /home/file.csv
使用 powershell 可以轻松地向 bcp 提供多行查询:
PS> $query = @'
select *
from <table>
'@
PS> bcp $query queryout <outfile> -d <database> -T -S <server> -c
我遇到了同样的问题,可能不是一个很好的方法。但是,我做了类似以下的事情
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
而且我必须说,如果您使用类似全局临时表,那么全局临时表在执行查询后会自行删除。在某些情况下你不能使用它
真正对我有用的是:
@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
相当于cat file
在 unix
我对复杂查询所做的是使用所需语句创建一个存储过程并从 BCP 调用它:
bcp "exec db.schema.stored_procedure" queryout "c:\file.txt" -T -S localhost -t "|" -c
这对我很有用。问候!
我制作了自己的脚本(称为 of bulk.sh
)来执行此操作(不是最佳实践,也不是最佳实践……该脚本太丑陋,但非常实用)。
#!/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
你可以试试,有:
$ docker run -v /path/to/your/sql/file/folder:/backup -it mcr.microsoft.com/mssql-tools
$ bash bulk.sh