Sql server 在SQL Server 2012中选择查询后运行更新或插入查询

Sql server 在SQL Server 2012中选择查询后运行更新或插入查询,sql-server,insert-update,Sql Server,Insert Update,我每天早上都有一个大数据源,它通过一个truncate查询转储到SQL Server表中 我需要使用此转储中的任何更改更新主表的某些部分 并将任何新行(基本上是其余的)也从这个转储添加到我的主表中 为了减少运行时间,将修改此truncate查询,使其仅覆盖过去2年 我该怎么做呢 两个表都有相同的结构,所以希望这应该是相当直接的。正确的做法应该是使用merge语句。 更多信息请参见此处 示例C中提到的场景就是您应该遵循的情况 -- Create a temporary table variabl

我每天早上都有一个大数据源,它通过一个truncate查询转储到SQL Server表中

我需要使用此转储中的任何更改更新主表的某些部分 并将任何新行(基本上是其余的)也从这个转储添加到我的主表中

为了减少运行时间,将修改此truncate查询,使其仅覆盖过去2年

我该怎么做呢


两个表都有相同的结构,所以希望这应该是相当直接的。

正确的做法应该是使用merge语句。 更多信息请参见此处

示例C中提到的场景就是您应该遵循的情况

-- Create a temporary table variable to hold the output actions.  
DECLARE @SummaryOfChanges TABLE(Change VARCHAR(20));  

MERGE INTO Sales.SalesReason AS Target  
USING (VALUES ('Recommendation','Other'), ('Review', 'Marketing'), 
              ('Internet', 'Promotion'))  
       AS Source (NewName, NewReasonType)  
ON Target.Name = Source.NewName  
WHEN MATCHED THEN  
UPDATE SET ReasonType = Source.NewReasonType  
WHEN NOT MATCHED BY TARGET THEN  
INSERT (Name, ReasonType) VALUES (NewName, NewReasonType)  
OUTPUT $action INTO @SummaryOfChanges;  

-- Query the results of the table variable.  
SELECT Change, COUNT(*) AS CountPerChange  
FROM @SummaryOfChanges  
GROUP BY Change; 

正确的做法应该是使用merge语句。 更多信息请参见此处

示例C中提到的场景就是您应该遵循的情况

-- Create a temporary table variable to hold the output actions.  
DECLARE @SummaryOfChanges TABLE(Change VARCHAR(20));  

MERGE INTO Sales.SalesReason AS Target  
USING (VALUES ('Recommendation','Other'), ('Review', 'Marketing'), 
              ('Internet', 'Promotion'))  
       AS Source (NewName, NewReasonType)  
ON Target.Name = Source.NewName  
WHEN MATCHED THEN  
UPDATE SET ReasonType = Source.NewReasonType  
WHEN NOT MATCHED BY TARGET THEN  
INSERT (Name, ReasonType) VALUES (NewName, NewReasonType)  
OUTPUT $action INTO @SummaryOfChanges;  

-- Query the results of the table variable.  
SELECT Change, COUNT(*) AS CountPerChange  
FROM @SummaryOfChanges  
GROUP BY Change; 

你问的不是很清楚。您可能需要提供更多关于您正在使用的结构以及它将如何改变的详细信息。当您说“truncate query”时,您的意思是源表被完全清除并重新填充吗?如果提供的数据更改到了一个更有限的集合,而您只是在更新或插入新记录,那么为什么您的过程中需要更改任何内容?如果源中的某些内容因为旧而未被包含,那么主表中不会发生任何事情,对吗?简单的方法是添加一列LastModifiedOn(Datetime),并根据最近的任何更改,插入或更新另一个表。您好,当您说“truncate query”时,您的意思是源表已完全清除并重新填充?是的,我正在更新过去两年中的任何记录更改并插入任何新记录。每日数据集中任何未更改或已存在的记录都可以忽略。我喜欢LastModifiedOn(Datetime)的想法,但我不确定这是否可行,但我的主要问题是如何最好地编写插入更新查询。您所问的问题还不是很清楚。您可能需要提供更多关于您正在使用的结构以及它将如何改变的详细信息。当您说“truncate query”时,您的意思是源表被完全清除并重新填充吗?如果提供的数据更改到了一个更有限的集合,而您只是在更新或插入新记录,那么为什么您的过程中需要更改任何内容?如果源中的某些内容因为旧而未被包含,那么主表中不会发生任何事情,对吗?简单的方法是添加一列LastModifiedOn(Datetime),并根据最近的任何更改,插入或更新另一个表。您好,当您说“truncate query”时,您的意思是源表已完全清除并重新填充?是的,我正在更新过去两年中的任何记录更改并插入任何新记录。每日数据集中任何未更改或已存在的记录都可以忽略。我喜欢LastModifiedOn(Datetime)的想法,但不确定这是否可行,但我的主要问题是如何最好地编写插入更新查询Hi Samuel A C,这似乎是我要找的指南,非常感谢。我的第一次运行需要2个小时才能完成,但在那之后,我的新主文件应该运行得更快,因为数据集将更小,更新/插入将更少。嗨,Samuel A C,这似乎是我要找的指南,非常感谢。我的初始运行需要2个小时才能完成,但之后我的新主文件应该运行得更快,因为数据集会更小,更新/插入会更少。