我试图将表数据从一个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)
。我可以检查一下我认为的问题"记录在源数据中,它只是一个很长的字符串,但我没有看到任何其他特殊的信息。
在生成格式文件时我还应该做些什么或者我还缺少什么?
答案 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
应该有效。