19

使用 bcp 时如何指定带有长查询的输入 sql 文件?我尝试使用该-i选项,但它一直抱怨没有额外信息的命令行错误。这可能吗?

4

9 回答 9

11

我今天遇到了这个问题,并找到了一个方便的解决方法,至少在临时情况下是这样。

任何具有连接权限的用户都可以创建临时表。这意味着您还可以创建 GLOBAL 临时表。

只需使用带有全局临时表的 SELECT ...INTO 在企业管理器(或 sql cmd 或其他)中运行您的查询,例如

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

然后,您可以在 BCP 查询中使用一个简单的临时表

SELECT * FROM ##mytemptable

然后通过企业管理器删除临时表

DROP TABLE ##mytemptable
于 2013-05-16T08:27:31.097 回答
9

我做了其他方法来解决这个问题。

我创建了一个批处理文件,它读取文件并在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

该脚本接收两个参数:

  1. 有查询的文件名;
  2. 导出数据的文件名;

像这样在 cmd 中执行脚本: export-query.bat query.sql export.txt

我希望有所帮助。

于 2016-05-30T20:50:13.837 回答
8

就我而言,BCP 实用程序仅支持直接写入命令行的 Transact-SQL 查询。前任:

bcp "SELECT Name FROM AdventureWorks.Sales.Currency" queryout Currency.Name.dat -T -c

根据其参考“-i”选项:

指定响应文件的名称,其中包含在使用交互模式(未指定 -n、-c、-w 或 -N)执行大容量复制时对每个数据字段的命令提示问题的响应。

请注意,它与sqlcmd 实用程序“-i”选项不同:

标识包含一批 SQL 语句或存储过程的文件。可以指定将按顺序读取和处理的多个文件 (...)

于 2012-05-13T03:48:14.477 回答
3

尝试 :

query=$( cat < /file.sql )
export query
bcp "${query}" queryout /home/file.csv
于 2019-06-28T16:50:22.267 回答
1

使用 powershell 可以轻松地向 bcp 提供多行查询:

PS> $query = @'
    select * 
    from <table>
'@
PS> bcp $query queryout <outfile> -d <database> -T -S <server> -c
于 2018-07-17T03:32:28.690 回答
1

我遇到了同样的问题,可能不是一个很好的方法。但是,我做了类似以下的事情

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

而且我必须说,如果您使用类似全局临时表,那么全局临时表在执行查询后会自行删除。在某些情况下你不能使用它

于 2019-05-20T13:35:22.963 回答
1

真正对我有用的是:

@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

于 2020-05-27T06:44:16.473 回答
0

我对复杂查询所做的是使用所需语句创建一个存储过程并从 BCP 调用它:

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

这对我很有用。问候!

于 2020-06-09T16:28:18.290 回答
0

我制作了自己的脚本(称为 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
于 2020-09-19T02:12:48.887 回答