2017-09-13 68 views
0

一个SQL数据库表我有一个插入值从表到另一个表的存储过程,见下图:如何更新基于条件

USE [DB] 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
       CREATE PROCEDURE [dbo].[InsertAverageRunTimings] 

        (
         @LatesVersionTested varchar(50) = NULL 
        ) 
       AS 
       BEGIN 
        INSERT INTO TestingToolTestPerfomanceBenchmark(LatestVersionTested, TestCode, TestSequence, AverageRuntime) 
        SELECT LatestVersionTested, TestCode, TestSequence, AverageRuntime 
        FROM #temptable2 
        WHERE LatestVersionTested NOT IN (SELECT LatestVersionTested FROM TestingToolTestPerfomanceBenchmark) 

    END 

Temptable2和TestingToolTestPerfomanceBenchmark有这样的信息:

LatestVersionTested TestSequence AverageRuntime 
3.21 - 48 Update 78 1     5.34 
3.21 - 48 Update 78 15    6.32 
3.21 - 48 Update 78 16    5.93 
3.21 - 48 Update 78 17    21.09 
3.21 - 48 Update 78 18    0.64 
3.21 - 48 Update 78 19    0.15 
3.21 - 48 Update 78 20    0.12 
3.21 - 48 Update 78 21    0.12 
3.21 - 48 Update 78 22    0.91 
3.21 - 48 Update 78 25    13.93 
3.21 - 48 Update 95 1     1.40 
3.21 - 48 Update 95 15    0.74 
3.21 - 48 Update 95 16    1.27 
3.21 - 48 Update 95 17    5.27 
3.21 - 48 Update 95 18    3.62 
3.21 - 48 Update 95 19    2.53 
3.21 - 48 Update 95 20    2.52 
3.21 - 48 Update 95 21    2.33 
3.21 - 48 Update 95 22    0.61 
3.21 - 48 Update 95 25    2.05 
3.21 - 48 Update 93 1     1.58 
3.21 - 48 Update 93 15    0.85 
3.21 - 48 Update 93 16    1.45 
3.21 - 48 Update 93 17    5.18 
3.21 - 48 Update 93 18    3.48 
3.21 - 48 Update 93 19    2.50 
3.21 - 48 Update 93 20    2.48 
3.21 - 48 Update 93 21    2.16 
3.21 - 48 Update 93 22    0.70 
3.21 - 48 Update 93 25    2.36 

如果在TestingToolTestPerfomanceBenchmark表中的LatestVersionTested列中未找到temptable2中LatestVersionTested列中的值,则存储过程将插入这些值。

我想实现的是,如果LatestVersionTested两个表中是相同的,在temptable2的AverageRuntime值必须更换AverageRuntime在TestingToolTestPerfomanceBenchmark表中的值

如何修改我的存储过程来实现这一目标?

+0

这是TestingToolTestPerfomanceBenchmark主键?我认为这不仅仅是'LatestVersionTested',还有'TestCode',但是,在你的WHERE子句中,你只是不想找到'LatestVersionTested',你应该添加所有PK字段以避免重复? –

+0

@SergioPrats主键是TestSequence – Immortal

回答

1
CREATE PROCEDURE [dbo].[InsertAverageRunTimings] 

(
@LatesVersionTested varchar(50) = NULL 
) 
AS 
BEGIN 

    IF EXISTS (SELECT LatestVersionTested FROM TestingToolTestPerfomanceBenchmark WHERE LatestVersionTested= @LatesVersionTested) 
    BEGIN 
    UPDATE TestingToolTestPerfomanceBenchmark SET AverageRuntime= a.AverageRuntime 
    FROM #temptable2 a 
    WHERE LatestVersionTested [email protected] 

    END ELSE BEGIN 

    INSERT INTO TestingToolTestPerfomanceBenchmark(LatestVersionTested, TestCode, TestSequence, AverageRuntime) 
    SELECT LatestVersionTested, TestCode, TestSequence, AverageRuntime 
    FROM #temptable2 
    WHERE LatestVersionTested = @LatesVersionTested 

    END 

END 
0

如果你的存储过程插入你需要的所有记录,那么不应该有任何两个都不存在。

然而,你不得不看看最新版本,因为它不是唯一的,但最新版本和测试序列的组合。

您在INSERT中没有考虑测试序列,难道只有一次插入版本测试序列?

如果是真的,你可以这样做:

CREATE PROCEDURE [dbo].[InsertAverageRunTimings] 

    @LatesVersionTested varchar(50) = NULL 

    AS 
    BEGIN 

     /*Insert missing records*/ 
     INSERT INTO TestingToolTestPerfomanceBenchmark 
      ( 
       LatestVersionTested, 
       TestCode, 
       TestSequence, 
       AverageRuntime 
      ) 
     SELECT LatestVersionTested, 
       TestCode, 
       TestSequence, 
       AverageRuntime 
     FROM #temptable2 
     WHERE LatestVersionTested NOT IN 
     (
      SELECT LatestVersionTested 
      FROM TestingToolTestPerfomanceBenchmark 
     ) 
     /*Update the records so the runtimes match as all records are now inserted*/ 
     UPDATE  PB 
     SET   PB.AverageRuntime     = T2.AverageRunTime 
     FROM  TestingToolTestPerfomanceBenchmark AS PB 
     INNER JOIN #TempTable2       AS T2 ON PB.LatestVersionTested = T2.LatestVersionTested AND PB.TestSequence  = T2.TestSequence 
     WHERE  PB.AverageRuntime     <> T2.AverageRuntime; 


    END