许多列的sql merge语句

时间:2014-09-23 14:57:14

标签: c# sql sql-server excel

我目前正在开发一个C#程序,它需要一个巨大的excel表(~14,300行,90列),需要将它插入数据库(SQL server 2014)。用户可以在DB中搜索不同的产品,并最终为客户报价。

要插入我已成功使用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列?

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

合并事务只会更新您告诉它的内容,通常一次只能更新一行。它将取决于合并目标(您可以声明多个)。我会说总是一次做一行,但这比我愿意做的更大胆,因为它可能是错的。

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

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

编辑:我认为SSIS包更适合这个只是fyi:)

答案 2 :(得分:0)

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

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

类似于插入。

答案 3 :(得分:0)

ALTER proc [dbo].[MST_Employee_Insert_Update]
  @XMLSTR xml = '<DocumentElement><VM_MST_Employee><ID>1</ID></VM_MST_Employee></DocumentElement>',
  @OUTPARAM int = 0 out
AS
BEGIN
 SET @OUTPARAM = 0;
 SELECT 
 x.value('ID[1]','int') as ID,
 INTO #MST_Employee
 from @XMLSTR.nodes('/DocumentElement/VM_MST_Employee') as xtbl(x)

        SELECT * FROM #MST_Employee

        MERGE MST_Employee As TARGET
        USING #MST_Employee  AS SOURCE ON TARGET.ID = SOURCE.id
        WHEN MATCHED THEN
      UPDATE SET 
      TARGET.FirstName =  SOURCE.FirstName,

      WHEN NOT MATCHED THEN
      INSERT (FirstName) VALUES( FirstName );

            if @@ERROR = 0
            BEGIN
            SET @OUTPARAM = 1;
            END
            ELSE
            BEGIN
            SET @OUTPARAM = 0;
            END
END