多列的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列中的每一列?
您必须逐一列出所有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