多列的sql merge语句

本文关键字:merge 语句 sql | 更新日期: 2023-09-27 18:24:01

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

为了插入,我成功地使用SQLBulkcopy将excel行插入到临时表中。问题是,我想使用merge语句来合并我的暂存表和实际表,因为随着时间的推移,同一文件可能会多次上传,但变化非常小。我发现的所有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列中的每一列?

多列的sql merge语句

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

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

如果行已经存在(即合并目标匹配),则您只需要更新所需的列(不需要每列都更新),如果它们不匹配,则必须对整行进行插入。

这是在回答你的问题,还是我遗漏了什么问题?

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

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

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

插入件也是如此。

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