批量数据源不支持SQLNUMERIC或SQLDECIMAL数据类型

时间:2011-08-31 15:11:18

标签: sql-server tsql sql-server-2008

我正在使用BCP导出和导入数据,但似乎不支持SQLNUMERIC或SQLDECIMAL数据类型。出口似乎很好:

-- hit alt+Q then M to enable SQLCMD mode
use tempdb
go
create table mytest (a decimal);
insert mytest values (3.3);
-- export to c drive
!!bcp "tempdb..mytest" out "c:\mytest.dat" -T -n -S"YourServer\YourInstance" 
!!bcp "tempdb..mytest" format nul -T -n  -f "c:\mytest.fmt" -S"YourServer\YourInstance" 

GO

这没关系,但是当我然后重新导入数据时(如下所示):

SELECT a.* 
FROM OPENROWSET( 
    BULK 'C:\mytest.dat', 
    FORMATFILE = 'C:\mytest.fmt') AS a

我收到错误消息:

Msg 4838, Level 16, State 1, Line 2
The bulk data source does not support the SQLNUMERIC or SQLDECIMAL data types.

问题如何导入使用BCP导出的数字数据? 我可以控制此问题中显示的bcp命令,但不控制表定义。首选的是仅限T-SQL的解决方案。

1 个答案:

答案 0 :(得分:2)

我尝试使用字符一(“-c”)而不是使用“原生”格式,而且它有效。我使用的修改过的脚本是:

use tempdb 
go 
create table mytest (id int, t varchar(12), a decimal(18,2), c char); 
insert mytest values (1, 'test1', 3.6, 'a');
insert mytest values (2, 'test3', 3.3, 'b');
go 
!!bcp "tempdb..mytest" out "d:\temp\mytest.dat" -T -c -S"localhost"  
!!bcp "tempdb..mytest" format nul -T -c  -f "d:\temp\mytest.fmt" -S"localhost"  

GO 

select * from mytest

SELECT a.*  
FROM OPENROWSET(  
    BULK 'd:\temp\mytest.dat',
    FORMATFILE = 'd:\temp\mytest.fmt') AS a 

我不确定你的情况是否可行,但你可以尝试一下。