2014-09-23 57 views
2

我目前正在开发一个C#程序,需要一个巨大的Excel表(〜14,300行,90列),并需要将其插入数据库(SQL Server 2014)。用户可以通过数据库搜索不同的产品并最终为客户提供报价。许多列的SQL合并语句

插入我成功地使用SQLBulkcopy将Excel行插入登台表中。问题是,我想使用合并语句来合并我的登台表和真实表,因为随着时间的推移,可能会有多次上传相同的文件。所有SQL合并的例子我发现是这个样子:

MERGE INTO maintable as Target 
USING stagingtable as Source 
ON Target.columnA = Source.columnA 
WHEN MATCHED THEN 
UPDATE SET Target.Name = Source.Name 
WHEN NOT MATCHED THEN 
INSERT (columnA, Name) 
VALUES (Source.columnA, source.Name) 

声明的工作,但问题是,我的excel文件有90列。是否有办法一次更新整行,或者是否需要更新每行的90列?

+1

你应该为你的朋友问另一个问题,我想你会有更好的运气获得答案。你可以链接到这个问题,所以你不必再输入描述 – reggaeguitar 2014-09-23 15:01:21

+0

你是我发布后实现的。我的第一篇文章,通常只是一个潜伏者。 – 2014-09-23 15:02:33

+1

您可以根据需要更新/插入任意数量的列,只能匹配2个条件,但请记住,其目的是“该记录是否存在?如果更新,如果没有插入”,则不会尝试确定是否已经存在的行已经改变。 – 2014-09-23 15:10:19

回答

0

您必须逐一列出所有90列,没有更新整行。转到SSMS,选择表格,右键单击,脚本表格为 - >更新为,这会给你一个脚本中的所有列的列表,你可以修改或复制/粘贴到你的合并脚本。

+0

嗯,这将节省我几个小时的打字,谢谢你。 – 2014-09-24 08:20:38

0

合并事务只会更新您告诉它的内容,并且一般只是一次一行。它将关闭合并目标(您可以声明多个)。我会说总是一次只做一行,但这是一个比我愿意做的更大胆的陈述,因为它可能是错误的。

如果行已经存在(即合并目标匹配),那么你只需要更新你想要的列(你不需要做每一个),如果它们不匹配,那么你必须做的整行插入。

这是回答你的问题,还是我错过了什么问题?

编辑:我觉得一个SSIS包会更适合这个仅供参考:)

+0

excel工作表是一个很大的价格表,它提供了有关产品和服务的信息。所以随机一栏可以改变,就像'产品服务的实验室'一样。因为我不知道用户将更改哪列,所以整行更新很重要。 – 2014-09-24 11:37:13

+0

该列必须具有某种唯一标识符,这就是您的目标,然后相应地分配列值。不过,我认为SSIS包会更好,您可以将BCP转换为您提到的临时表,然后使用SSIS包将所有数据合并到一起。 – alykins 2014-09-24 13:37:16

0

可以使用MERGE语句写入多个列。它使用与其他DML使用的基本相同的语法:

.... 
UPDATE SET A = a, B = b, ... 
... 

类似地用于插入。