SQL Server OPENROWSET错误读取bcp文件

时间:2018-02-01 15:36:07

标签: sql-server bulkinsert

我试图将表数据从一个SQL Server传输到另一个SQL Server,并希望使用bcp实用程序。这纯粹是为了在两个相同的模式之间传输数据,但我不能使用类似SSDT的东西;我需要一些可编写脚本且可移植的东西,以便只有SQL服务器和SSMS访问才能运行。

我正在生成一个本机输出文件和格式文件,如下所示:

$> bcp database.TableName OUT c:\data\bcp\TableName.bcp -T -N -S SQLINSTANCE

$> bcp database.TableName format nul -f c:\data\bcp\TableName.fmt -T -N

然后在Management Studio中我试图反过来读取这样的文件:

SELECT 
    *
FROM 
    OPENROWSET (BULK 'c:\data\bcp\TableName.bcp',
                FORMATFILE = 'c:\data\bcp\TableName.fmt') AS t1

但是我收到了这个错误:

  

批量加载失败。第6行第19行的数据文件中的列太长。验证是否正确指定了字段终止符和行终止符。

我已成功完成此过程,并且适用于其他表。但我遇到了这张桌子的问题。提到的列的数据类型为nvarchar(max)。我可以检查一下我认为的问题"记录在源数据中,它只是一个很长的字符串,但我没有看到任何其他特殊的信息。

在生成格式文件时我还应该做些什么或者我还缺少什么?

1 个答案:

答案 0 :(得分:1)

如果您只是为了导入到另一个SQL Server而导出,则可以使用本机格式。在这种情况下,您不需要使用格式文件。只需进行本地导出和导入。

请注意,您指定的是大写-N,而且这不是原生的。 Native低于-n

您应该使用以下内容导出:

bcp database.Schema.TableName OUT c:\data\bcp\TableName.bcp -T -n -S SQLINSTANCE

然后在导入方面,我使用BULK IMPORT提取,它根本不需要原生的格式文件:

BULK INSERT TargetDB.dbo.TargetTable
FROM 'c:\data\bcp\TableName.bcp'
WITH (DATAFILETYPE = 'native');

如果你不能使用BULK INSERT并且绝对必须使用OPENROWSET,那么你需要一个格式文件。 bcp可以为您生成,但同样,小写-n

bcp database.Schema.TableName format nul -f c:\data\bcp\TableName.fmt -T -n -S SQLINSTANCE

现在您的OPENROWSET应该有效。