2

我的要求:

输入文件:

1,abc,xyx

2,def,mno

3,吉,SUV

数据库表结构:

Col1 字符

col2 字符

col3 字符

col4 字符

col5 字符

BCP后表中数据:

col1 col2 col3 col4 col5

1 abc xyz ab xy

2 def mno de mn

3 ghi suv gh su

基本上 col4 和 col5 是从 col2 和 col3 值计算的值。

SQL Server BCP 实用程序是否支持此类操作?任何指针将不胜感激。

干杯GT

4

5 回答 5

3

您可以使用格式文件来指定哪个数据字段映射到哪个列

使用 bcp 导入时可以使用格式文件:

为您的表创建一个格式文件:

 bcp [table_name] format nul -f [format_file_name.fmt] -c -T 

这将创建一个像这样的文件:

 9.0
5
1       SQLCHAR       0       100     ","      1     Col1             SQL_Latin1_General_CP1_CI_AS
2       SQLCHAR       0       100     ","      2     Col2             SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR       0       100     ","      3     Col3           SQL_Latin1_General_CP1_CI_AS
4       SQLCHAR       0       100     ","      3     Col4           SQL_Latin1_General_CP1_CI_AS
5       SQLCHAR       0       100     ","      3     Col5           SQL_Latin1_General_CP1_CI_AS

编辑导入文件。诀窍是删除不需要的列(本例中的字段 4 和 5)并更新列数:这是格式文件中的第二行。在本例中,将 5 更改为 3。然后使用此格式文件导入数据,指定您的输入文件、此格式文件和分隔符:

bcp [table_name] in [data_file_name] -t , -f [format_file_name.fmt] -T 
于 2009-05-29T08:19:50.500 回答
2

您可以 BCP 进入一个临时表,然后以适当的结构从临时表插入到另一个表。

您还可以BULK INSERT在 SQL 中使用与外部 BCP 命令相同的格式文件和源文件,以便您可以在 SQL 中运行整个批处理:BULK INSERT匹配输入的表,然后是INSERT INTO最终表。

另一个预处理选项,如 Perl(或任何其他命令行工具)是 PowerShell 在使用 BCP(可能使用 XML 选项)之前通过管道传输数据:http ://www.sqlservercentral.com/articles/powershell/ 65196/

我的首选选项可能是 SSIS,它为您提供了整个转换库,包括派生列。

于 2008-12-17T03:02:17.713 回答
1

不,您不能使用 BCP 执行此操作,尽管您可以使用 BCP 从查询中提取数据集并转储到文件中。

如果您想在不使用源查询的情况下执行此操作,则必须将 bcp 输出到文件,使用 perl 脚本或类似脚本对文件进行后处理以生成计算列,然后将文件重新导入目标带有适当格式的 BCP 控制文件。

编辑: BCP 相当简单。如果您不能使用客户端工具,您可以插入临时表,然后在存储过程中计算派生值。

于 2008-12-16T22:11:48.627 回答
0

SQL Server 集成服务和转换将是我选择的方法。它是一个非常简单的包来构建所需的转换——而且 SSIS 非常快,易于安排等。

于 2008-12-17T03:18:18.790 回答
-1

如果您不怕编程一点,您可以使用 ADO.NET 来完成。通过实现自定义 IDataReader,可以轻松完成此操作以及您希望即时进行的任何其他转换。SqlBulkCopy 采用 IDataReader 并批量插入它提供的数据。然后,您的读者可以使用输入文件并提供其他列、转换数据、查找键值等等。

于 2014-07-03T08:43:23.163 回答