我可以用bcp指定输入sql文件吗?

问题描述 投票:0回答:10

使用 bcp 时如何指定具有长查询的输入 sql 文件?我尝试使用

-i
选项,但它一直抱怨命令行错误,没有额外的信息。这可能吗?

sql sql-server sql-server-2008 bcp
10个回答
12
投票

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

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

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

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

然后您可以通过简单的操作在 BCP 查询中使用临时表

SELECT * FROM ##mytemptable

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

DROP TABLE ##mytemptable

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 中执行脚本,如下所示: 导出查询.bat 查询.sql 导出.txt

希望有帮助。


8
投票

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

bcp“从 AdventureWorks.Sales.Currency 中选择名称”查询Currency.Name.dat -T -c

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

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

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

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


3
投票

尝试:

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

2
投票

使用powershell可以轻松给bcp进行多行查询:

PS> $query = @'
    select * 
    from <table>
'@
PS> bcp $query queryout <outfile> -d <database> -T -S <server> -c

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

我必须说,如果您使用全局临时表,那么在执行查询后全局临时表将被删除。在某些情况下你不能使用这个


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
相当于unix中的
cat file


0
投票

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

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

这对我来说非常有用。问候!


0
投票

我制作了自己的脚本(称为

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

0
投票

生成
bcp
命令的 Python 函数

from pathlib import Path


copy_params = "-N -E -q"

def bcp_db_query_to_local(query: Path, creds: str):
    sql = query.read_text()
    path_to_save = f"my_folder/{query.name}.bcp"
    return f'bcp "{sql}" queryout {path_to_save} {creds} {copy_params}'

query = Path("my_query")
creds = "-S my_server -T"
print(bcp_db_query_to_local(query, creds))
© www.soinside.com 2019 - 2024. All rights reserved.