SQL 服务器 OPENROWSET 读取 bcp 文件时出错

SQL Server OPENROWSET error reading bcp file

我正在尝试将 table 数据从一台 SQL 服务器传输到另一台服务器,并希望为此使用 bcp 实用程序。这纯粹是为了在两个相同的模式之间传输数据,但我无法使用 SSDT 之类的东西;我需要一些可以是 scriptable 和 portable 的东西,这样它就可以被其他人 运行 使用 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

但是我收到这个错误:

The bulk load failed. The column is too long in the data file for row 6, column 19. Verify that the field terminator and row terminator are specified correctly.

我之前成功地遵循了这个过程,它适用于其他 tables。但是我 运行 对此 table 产生了疑问。提到的列的数据类型为 nvarchar(max)。我可以检查我认为是源数据中的 "problem" 记录,它只是一个很长的字符串,但我看不到它有什么特别之处。

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

如果您只是为了导入到另一台 SQL 服务器而导出,则本机格式是最佳选择。在这种情况下,您不需要使用格式文件。只需进行本机导出和导入。

请注意,您指定的是大写字母 -N,这不是原生的。原生较低 -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 应该可以工作了。