哎,BCP 来个会的。

zhouixi 2012-03-21 09:58:43
我表示,对用语句输出文件无语了。不知道哪里错了。


--这个一执行出来吧,全是BCP的说明信息
exec master..xp_cmdshell
'bcp testt.dbo.TABLENAME out g:\abc.xls -c -q -s "OO_XXJJEE" -u "administrator" -p "123456"'
--这个是说SA登录失败。我用ADMIN也不行
EXEC master..xp_cmdshell 'bcp "SELECT TOP 20 * FROM testt.dbo.TABLENAME " queryout c:\currency2.xls -c -U "sa" -P""'
--同上
EXEC master..xp_cmdshell 'bcp 数据库名.dbo.表名 out D:\Temp.xls -c -q -S "Localhost" -U "sa" -P ""'




高手们阿。怎么整这个问题。
...全文
162 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouixi 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 shuobudede 的回复:]
bcp 呵呵 这是个细心活
[/Quote]

不细心不行阿,
zhouixi 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 travylee 的回复:]
SQL code

/******* 导出到excel */
EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""'

/*********** 导入Excel */
SELECT *
FROM OpenDataSour……
[/Quote]


我反正是佩服你的资料。我问啥,你就有啥
shuobudeDE 2012-03-22
  • 打赏
  • 举报
回复
在cmd 里:bcp 数据库名.dbo.表 out d:\abc.xls -c -q -S -U "sa" -P 可以的
  • 打赏
  • 举报
回复

1) 使用BCP导出整个表或视图。

BCP AdventureWorks.sales.currency out c:\currency1.txt -c -U"sa" -P"password" --使用密码连接



BCP AdventureWorks.sales.currency out c:\currency1.txt -c -T --使用信任连接

下面是上述命令执行后的输出结果

Starting copy...
105 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total : 10 Average : (10500.00 rows per sec.)

下面是currency1.txt的部分内容

AED Emirati Dirham 1998-06-01 00:00:00.000
AFA Afghani 1998-06-01 00:00:00.000
... ... ...
... ... ...
ZWD Zimbabwe Dollar 1998-06-01 00:00:00.000

在使用密码登录时需要将-U后的用户名和-P后的密码加上双引号。

注:BCP除了可以在控制台执行外,还可以通过调用SQL Server的一个系统存储过程xp_cmdshell以SQL语句的方式运行BCP。如上述第一条命令可改写为

EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency out c:\currency1.txt -c -U"sa" -P"password"'
执行xp_cmdshell后,返回信息以表的形式输出。为了可以方便地在SQL中执行BCP,下面的命令都使用xp_cmdshell执行BCP命令。

(2) 对要导出的表进行过滤。

BCP不仅可以接受表名或视图名做为参数,也可以接受SQL做为参数。通过SQL语句可以对要导出的表进行过滤,然后导出过滤后的记录。

EXEC master..xp_cmdshell 'BCP "SELECT TOP 20 * FROM AdventureWorks.sales.currency" queryout c:\currency2.txt -c -U"sa" -P"password"'

BCP还可以通过简单地设置选项对导出的行进行限制。

EXEC master..xp_cmdshell 'BCP "SELECT TOP 20 * FROM AdventureWorks.sales.currency" queryout c:\currency2.txt -F 10 -L 13 -c -U"sa" -P"password"'

这条命令使用了两个参数-F 10和-L 13,表示从SELECT TOP 20 * FROM AdventureWorks.sales.currency所查出来的结果中取第10条到13条记录进行导出。

3. 如何使用BCP导出格式文件

BCP不仅可以根据表、视图导入导出数据,还可以配合格式文件对导入导出数据进行限制。格式文件以纯文本文件形式存在,分为一般格式和xml格式。用户可以手工编写格式文件,也可以通过BCP命令根据表、视图自动生成格式文件。

EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency format nul -f c:\currency_format1.fmt -c -T'

上述命令将currency表的结构生成了一个格式文件currency_format1.fmt,下面是这个格式文件的内容。

9.0
3
1 SQLCHAR 0 6 "\t" 1 CurrencyCode SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 100 "\t" 2 Name SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 24 "\r\n" 3 ModifiedDate

这个格式文件记录了这个表的字段(共3个字段)类型、长度、字符和行分割符和字段名等信息。

BCP还可以通过-x选项生成xml格式的格式文件。

EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency format nul -f c:\currency_format2.fmt -x -c -T'
xml格式文件所描述的内容和普通格式文件所描述的内容完全一样,只是格式不同。

4. 如何使用BCP导入数据

BCP可以通过in命令将上面所导出的currency1.txt和currency2.txt再重新导入到数据库中,由于currency有主键,因此我们将复制一个和currency的结构完全一样的表。

SELECT TOP 0 * INTO AdventureWorks.sales.currency1 FROM AdventureWorks.sales.currency
将数据导入到currency1表中

EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:\currency1.txt -c -T'
导入数据也同样可以使用-F和-L选项来选择导入数据的记录行。

EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:\currency1.txt -c -F 10 -L 13 -T'
在导入数据时可以根据已经存在的格式文件将满足条件的记录导入到数据库中,不满足则不导入。如上述的格式文件中的第三个字段的字符长度是24,如果某个文本文件中的相应字段的长度超过24,则这条记录将不被导入到数据库中,其它满足条件的记录正常导入。

使用普通的格式文件

EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:\currency1.txt -F 10 -L 13 -c -f c:\currency_format1.fmt -T'
使用xml格式的格式文件

EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:\currency1.txt -F 10 -L 13 -c -x -f c:\currency_format2.fmt -T'

总结

BCP命令是SQL Server提供的一个快捷的数据导入导出工具。使用它不需要启动任何图形管理工具就能以高效的方式导入导出数据。当然,它也可以通过xp_cmdshell在SQL语句中执行,通过这种方式可以将其放到客户端程序中(如delphi、c#等)运行,这也是使客户端程序具有数据导入导出功能的方法之一。
shuobudeDE 2012-03-22
  • 打赏
  • 举报
回复
bcp 呵呵 这是个细心活
  • 打赏
  • 举报
回复

/******* 导出到excel */
EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""'

/*********** 导入Excel */
SELECT *
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions

/*动态文件名
declare @fn varchar(20),@s varchar(1000)
set @fn = 'c:\test.xls'
set @s ='''Microsoft.Jet.OLEDB.4.0'',
''Data Source="'+@fn+'";User ID=Admin;Password=;Extended properties=Excel 5.0'''
set @s = 'SELECT * FROM OpenDataSource ('+@s+')...sheet1$'
exec(@s)
*/

SELECT cast(cast(科目编号 as numeric(10,2)) as nvarchar(255))+' ' 转换后的别名
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions

/********************** EXCEL导到远程SQL */
insert OPENDATASOURCE(
'SQLOLEDB',
'Data Source=远程ip;User ID=sa;Password=密码'
).库名.dbo.表名 (列名1,列名2)
SELECT 列名1,列名2
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
mamamiya5613 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 zhouixi 的回复:]
引用 11 楼 mamamiya5613 的回复:
SQL code

-- -S -U -P必须大写
exec master..xp_cmdshell
'bcp testt.dbo.TABLENAME out g:\abc.xls -c -q -S "OO_XXJJEE" -U "administrator" --P "123456"'

--第二句缺 -S 还有-P 密码为空值
……
[/Quote]
exec master..xp_cmdshell 'bcp testt.dbo.TABLENAME out C:\abc.xls -c -q -S "OO_XXJJEE" -U "sa" -P "sa"'
zhouixi 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mamamiya5613 的回复:]
SQL code

-- -S -U -P必须大写
exec master..xp_cmdshell
'bcp testt.dbo.TABLENAME out g:\abc.xls -c -q -S "OO_XXJJEE" -U "administrator" --P "123456"'

--第二句缺 -S 还有-P 密码为空值
--第三句 直接用-T试试看,你这个是不是用wind……
[/Quote]



写个例子呗,我这边不行阿、
zhouixi 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 tongtong_qing 的回复:]
引用楼主 zhouixi 的回复:
我表示,对用语句输出文件无语了。不知道哪里错了。


SQL code

--这个一执行出来吧,全是BCP的说明信息
exec master..xp_cmdshell
'bcp testt.dbo.TABLENAME out g:\abc.xls -c -q -s "OO_XXJJEE" -u "administrator" -p "123456……
[/Quote]

我晕,SA可以连接。 但执行语句的话,会提示SA登录失败。
zhouixi 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 tongtong_qing 的回复:]
引用 9 楼 tongtong_qing 的回复:
为何不试试用-T登录试试


SQL code

EXEC master..xp_cmdshell 'bcp Northwind.dbo.a out f:\abc.txt -c -q -T'
结果:
output
----------------------------------------------------------……
[/Quote]

你这个是对的,但输出后的数据没有列名
99归一 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhouixi 的回复:]
我表示,对用语句输出文件无语了。不知道哪里错了。


SQL code

--这个一执行出来吧,全是BCP的说明信息
exec master..xp_cmdshell
'bcp testt.dbo.TABLENAME out g:\abc.xls -c -q -s "OO_XXJJEE" -u "administrator" -p "123456"'
--这个是说SA登录失败。我用……
[/Quote]
若不用-T。用用户,测试如下:

reconfigure
EXEC master..xp_cmdshell 'bcp Northwind.dbo.a out f:\abc.txt -c -q -U"SA" -P""'

结果如下:

output
-------------------------------------------------------------------------------------NULL
开始复制...
NULL
已复制 1 行。
网络数据包大小(字节): 4096
总时钟时间(毫秒) : 1 平均值: (每秒 1000.00 行。)
NULL

(7 行受影响)

mamamiya5613 2012-03-22
  • 打赏
  • 举报
回复

-- -S -U -P必须大写
exec master..xp_cmdshell
'bcp testt.dbo.TABLENAME out g:\abc.xls -c -q -S "OO_XXJJEE" -U "administrator" --P "123456"'

--第二句缺 -S 还有-P 密码为空值
--第三句 直接用-T试试看,你这个是不是用windows账户登陆sqlserver的,如果是的话改成混合登陆,再试试看
99归一 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 tongtong_qing 的回复:]
为何不试试用-T登录试试
[/Quote]

EXEC master..xp_cmdshell 'bcp Northwind.dbo.a out f:\abc.txt -c -q -T'
结果:
output
-------------------------------------------------------------------------------------NULL
开始复制...
NULL
已复制 1 行。
网络数据包大小(字节): 4096
总时钟时间(毫秒) : 1 平均值: (每秒 1000.00 行。)
NULL
(7 行受影响)

99归一 2012-03-22
  • 打赏
  • 举报
回复
为何不试试用-T登录试试
zhouixi 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 flyfly2008 的回复:]
我也来顶一下
[/Quote]

zhouixi 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 travylee 的回复:]
引用 3 楼 travylee 的回复:

引用 2 楼 zhouixi 的回复:

哈哈,TRAV ,有解不。

又是bcp


又是bcp
[/Quote]

你是帮顶。
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 travylee 的回复:]

引用 2 楼 zhouixi 的回复:

哈哈,TRAV ,有解不。

又是bcp
[/Quote]

又是bcp
zhouixi 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 travylee 的回复:]
引用 2 楼 zhouixi 的回复:

哈哈,TRAV ,有解不。

又是bcp
[/Quote]

XX ,你回复一样的话。
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhouixi 的回复:]

哈哈,TRAV ,有解不。
[/Quote]
又是bcp
zhouixi 2012-03-21
  • 打赏
  • 举报
回复
哈哈,TRAV ,有解不。
加载更多回复(1)
bcp 实用工具在 Microsoft? SQL Server? 2000 实例和数据文件之间以用户指定的格式复制数据。 语法 bcp {[[database_name.][owner].]{table_name | view_name} | "query"} {in | out | queryout | format} data_file [-m max_errors] [-f format_file] [-e err_file] [-F first_row] [-L last_row] [-b batch_size] [-n] [-c] [-w] [-N] [-V (60 | 65 | 70)] [-6] [-q] [-C code_page] [-t field_term] [-r row_term] [-i input_file] [-o output_file] [-a packet_size] [-S server_name[\instance_name]] [-U login_id] [-P password] [-T] [-v] [-R] [-k] [-E] [-h "hint [,...n]"] 参数 database_name 指定的表或视图所在数据库的名称。如果未指定,则为用户默认数据库。 owner 表或视图所有者的名称。如果执行大容量复制操作的用户拥有指定的表或视图,则 owner 是可选的。如果没有指定 owner 并且执行大容量复制操作的用户不拥有指定的表或视图,则 Microsoft? SQL Server? 2000 将返回错误信息并取消大容量复制操作。 table_name 是将数据复制到 SQL Server 时 (in) 的目的表名,以及从 SQL Server 复制数据时 (out) 的源表名。 view_name 是将数据复制到 SQL Server 时 (in) 的目的视图名,以及从 SQL Server 复制数据时 (out) 的源视图名。只有其中所有列都引用同一个表的视图才能用作目的视图。有关将数据复制到视图的限制的更多信息,请参见 INSERT。 Query 是返回一个结果集的 Transact-SQL 查询。如果查询返回多个结果集,例如指定 COMPUTE 子句的 SELECT 语句,只有第一个结果集将复制到数据文件,随后的结果集被忽略。使用双引号引起查询语句,使用单引号引起查询语句中嵌入的任何内容。在从查询中大容量复制数据时,还必须指定 queryout。 in | out | queryout | format 指定大容量复制的方向。in 是从文件复制到数据库表或视图,out 是指从数据库表或视图复制到文件。只有从查询中大容量复制数据时,才必须指定 queryout。根据指定的选项(-n、-c、-w、-6 或 -N)以及表或视图分隔符,format 将创建一个格式文件。如果使用 format,则还必须指定 -f 选项。 说明 Microsoft SQL Server 6.5 中的 bcp 实用工具不支持大容量复制到包含 sql_variant 或 bigint 数据类型的表。 data_file 大容量复制表或视图到磁盘(或者从磁盘复制)时所用数据文件的完整路径。当将数据大容量复制到 SQL Server 时,此数据文件包含将复制到指定表或视图的数据。当从 SQL Server 大容量复制数据时,该数据文件包含从表或视图复制的数据。路径可以有 1 到 255 个字符。 -m max_errors 指定在大容量复制操作取消之前可能产生的错误的最大数目。bcp 无法复制的每一行都将被忽略并计为一个错误。如果没有包括该选项,则默认为 10。 -f format_file 指定格式文件的完整路径,该格式文件包含以前在同一个表或视图上使用 bcp 时的存储响应。当使用由 format 选项所创建的格式文件大容量复制入或复制出数据时,使用此选项。格式文件的创建是可选的。在提示几个格式问题之后,bcp 将提示是否在格式文件中保存回答。默认文件名为 Bcp.fmt。大容量复制数据时,bcp 可引用一个格式文件,因此不必重新交互输入以前的回答。如果未使用此选项,也没有指定 –n、-c、-w、-6 或 -N,则 bcp 将提示输入格式信息。 -e err_file 指定错误文件的完整路径,此错误文件用于存储 bcp 无法从文件传输到数据库的所有行。来自 bcp 的错误信息将发送到用户工作站。如果未使用此选项,则不创建错误文件。 -F first_row 指定要大容量复制的第一行的序数。默认值是 1,表示在指定数据文件的第一行。 -L last_row 指定要大容量复制的最后一行的序数。默认值是 0,表示指定数据文件中的最后一行。 -b batch_size 指定所复制的每批数据中的行数。每个批处理作为一个事务复制至服务器。SQL Server 提交或回滚(在失败时)每个批处理的事务。默认情况下,指定的数据文件中的所有数据都作为一批复制。请不要与 -h "ROWS_PER_BATCH = bb" 选项一起使用。 -n 使用数据的本机(数据库)数据类型执行大容量复制操作。此选项不提示输入每一字段,它将使用本机值。 -c 使用字符数据类型执行大容量复制操作。此选项不提示输入每一字段;它使用 char 作为存储类型,不带前缀,\t(制表符)作为字段分隔符,\n(换行符)作为行终止符。 -w 使用 Unicode 字符执行大容量复制操作。此选项不提示输入每一字段;它使用 nchar 作为存储类型,不带前缀,\t(制表符)作为字段分隔符,\n(换行符)作为行终止符。不能在 SQL Server 6.5 版或更早版本中使用。 -N 对非字符数据使用数据的本机(数据库)数据类型和对字符数据使用 Unicode 字符类型执行大容量复制操作。这是可替代 -w 选项的性能更高的选项,其目的是使用数据文件将数据从一个 SQL Server 传输到另一个 SQL Server 中。它不提示输入每一字段。在需要传输包含 ANSI 扩展字符的数据以及想利用本机模式的性能时,可以使用这一选项。不能在 SQL Server 6.5 版或更早版本中使用 -N 选项。 -V (60 | 65 | 70) 使用 SQL Server 早期版本中的数据类型执行大容量复制操作。此选项与字符 (-c) 或本机 (-n) 格式一起使用。此选项并不提示输入每一字段,它使用默认值。例如,若要将 SQL Server 6.5 中的 bcp 实用工具所支持(但 ODBC 不再支持)的日期格式大容量复制到 SQL Server 2000,可使用 -V 65 参数。 重要 将数据从 SQL Server 大容量复制到数据文件时,即使指定了 –V,bcp 实用工具也不为任何 datetime 或 smalldatetime 数据生成 SQL Server 6.0 或 SQL Server 6.5 的日期格式。日期将始终以 ODBC 格式写入。另外,由于 SQL Server 6.5 版或更早版本不支持可为空的 bit 数据,因此 bit 列中的空值写为值 0。 -6 使用 SQL Server 6.0 或 SQL Server 6.5 数据类型执行大容量复制操作。仅为保持向后兼容性。改为使用 –V 选项。 -q 在 bcp 实用工具和 SQL Server 实例的连接中执行 SET QUOTED_IDENTIFIERS ON 语句。使用该选项指定包含空格或引号的数据库、所有者、表或视图的名称。将由三部分组成的整个表名或视图名引在双引号 (" ") 中。 -C code_page 仅为保持向后兼容性。作为代替,请在格式文件或交互式 bcp 中为每一列指定一个排序规则名。 指定数据文件中的数据代码页。只有当数据中包含字符值大于 127 或小于 32 的 char、varchar 或 text 列时,code_page 才有用。 代码页值 描述 ACP ANSI/Microsoft Windows? (ISO 1252)。 OEM 客户程序使用的默认代码页。如果未指定 -C,则这是 bcp 使用的默认代码页。 RAW 不发生从一个代码页到另一个代码页的转换。因为不发生转换,所以这是最快的选项。 <值> 特定的代码页号码,例如 850。 -t field_term 指定字段终止符。默认的字段终止符是 \t(制表符)。使用此参数替代默认字段终止符。 -r row_term 指定行终止符。默认的行终止符是 \n(换行符)。使用此参数替代默认行终止符。 -i input_file 指定响应文件的名称,使用交互模式(未指定 –n、-c、-w、-6 或 -N)执行大容量复制时,响应文件包含对每一字段命令提示问题的响应。 -o output_file 指定接收 bcp 输出(从命令提示重定向)的文件的名称。 -a packet_size 指定发送到和发送自服务器的每个网络数据包的字节数。可以使用 SQL Server 企业管理器(或 sp_configure 系统存储过程)设置服务器配置选项。但是,使用此选项可以单个地替代服务器配置选项。packet_size 可以设置为 4096 到 65535 字节,默认值为 4096。 数据包大小的增加能够提高大容量复制操作的性能。如果要求一个较大的数据包而得不到,则使用默认设置。bcp 生成的性能统计显示出所使用数据包的大小。 -S server_name[\instance_name] 指定要连接到的 SQL Server 实例。指定 server_name 以连接该服务器上的 SQL Server 默认实例。指定 server_name\instance_name 以连接到该服务器上的 SQL Server 2000 命名实例。如果未指定服务器,则 bcp 连接到本地计算机上的 SQL Server 默认实例。从网络上的远程计算机执行 bcp 时,要求此选项。 -U login_id 指定用于连接到 SQL Server 的登录 ID。 -P password 指定登录 ID 的密码。如果未使用此选项,则 bcp 将提示输入密码。如果不带密码将此选项用于命令提示行末尾,则 bcp 将使用默认密码 (NULL)。 -T 指定 bcp 使用网络用户的安全凭据,通过信任连接连接到 SQL Server。不需要 login_id 和 password。 -v 报告 bcp 实用工具的版本号和版权。 -R 指定使用为客户端计算机的区域设置定义的区域格式,将货币、日期和时间数据大容量复制到 SQL Server 中。默认情况下,将忽略区域设置。 -k 指定在大容量复制操作中空列应保留一个空值,而不是对插入的列赋予默认值。[/quote]

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧