我目前正在开发一个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列?
答案 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