Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Upsert-sqlserver2005_Sql_Sql Server 2005_Upsert - Fatal编程技术网

Upsert-sqlserver2005

Upsert-sqlserver2005,sql,sql-server-2005,upsert,Sql,Sql Server 2005,Upsert,我有两张桌子: NewNotes MasterNotes 每个月,NewNotes表都会更新新账户和现有账户的新账户。我需要更新MasterNotes表中的现有注释,或者如果账号尚未在MasterNotes表中,则插入新注释 两个表都有三列:报告,账号,注释 要更新记录,账号和报告必须相同(MasterNotes的表可以有两个不同的账号和两个不同的报告) 有人能帮忙吗 到目前为止,我的想法如下: IF NOT EXISTS ( SELECT REP, ACCOUNT_NUMBER FROM Ma

我有两张桌子:

  • NewNotes
  • MasterNotes
  • 每个月,
    NewNotes
    表都会更新新账户和现有账户的新账户。我需要更新
    MasterNotes
    表中的现有注释,或者如果账号尚未在
    MasterNotes
    表中,则插入新注释

    两个表都有三列:
    报告
    账号
    注释

    要更新记录,账号和报告必须相同(MasterNotes的
    表可以有两个不同的账号和两个不同的报告)

    有人能帮忙吗

    到目前为止,我的想法如下:

    IF NOT EXISTS
    (
    SELECT REP, ACCOUNT_NUMBER
    FROM MasterNotes
    WHERE REP = (SELECT Report FROM NewNotes) AND
          ACCOUNT_NUMBER = (SELECT AccountNo FROM NewNotes)
    )
    INSERT INTO MasterNotes
    ELSE
    UPDATE
    
    我知道这是不正确的,因为子查询返回多个值,但我知道如何逐行执行

    或者像这样

    INSERT INTO MasterNotes
    SELECT Report, AccountNo, A.Notes
    FROM NewNotes A 
    LEFT OUTER JOIN MasterNotes B
        ON A.Report = B.REP AND A.AccountNo = B.ACCOUNT_NUMBER
    WHERE B.ACCOUNT_NUMBER IS NULL AND B.REP IS NULL
    UPDATE MasterNotes
    SET NOTE = B.Notes
    FROM MasterNotes A, NewNotes B
    WHERE A.ACCOUNT_NUMBER = B.AccountNo AND A.REP = B.Report
    

    这里有一些样品可以让你走。我在SQL2005中提供了两种执行这两种操作的方法。我个人更喜欢JOIN方法,但事实证明它们稍微慢一点——但我发现它们更容易写/读。它们在内部,但被注释掉了

    DECLARE @NewNotes TABLE (REPORT VARCHAR(10), ACCOUNT_NUMBER INT, NOTES VARCHAR(50))
    DECLARE @MasterNotes TABLE (REPORT VARCHAR(10), ACCOUNT_NUMBER INT, NOTES VARCHAR(50))
    
    INSERT INTO @MasterNotes (REPORT, ACCOUNT_NUMBER, NOTES)
    SELECT 'ABC', 123, 'CUSTOMER IS VERY NICE, SOMETIMES...' UNION
    SELECT 'DEF', 456, 'CUSTOMER IS ANGRY'
    
    INSERT INTO @NewNotes (REPORT, ACCOUNT_NUMBER, NOTES)
    SELECT 'ABC', 123, 'CUSTOMER IS VERY NICE' UNION
    SELECT 'DEF', 456, 'CUSTOMER IS ANGRY' UNION
    SELECT 'GHI', 789, 'CUSTOMER WANTS CALL BACK'
    
    UPDATE M SET NOTES = N.NOTES
    FROM @MasterNotes M, @NewNotes N
    WHERE M.REPORT = N.REPORT
    AND M.ACCOUNT_NUMBER = N.ACCOUNT_NUMBER
    
    /** ALTERNATE UPDATE METHOD **/
    --UPDATE M SET NOTES = N.NOTES
    --FROM @MasterNotes M
    --JOIN @NewNotes N
    --   ON M.REPORT = N.REPORT
    --   AND M.ACCOUNT_NUMBER = N.ACCOUNT_NUMBER
    
    INSERT INTO @MasterNotes (REPORT, ACCOUNT_NUMBER, NOTES)
    SELECT N.REPORT, N.ACCOUNT_NUMBER, N.NOTES
    FROM @NewNotes N
    WHERE NOT EXISTS (SELECT ACCOUNT_NUMBER FROM @MasterNotes M WHERE M.REPORT = N.REPORT)  
    
    /** ALTERNATE INSERT METHOD **/
    --INSERT INTO @MasterNotes (REPORT, ACCOUNT_NUMBER, NOTES)
    --SELECT  N.REPORT, N.ACCOUNT_NUMBER, N.NOTES
    --FROM @NewNotes N
    --LEFT OUTER JOIN @MasterNotes M 
    --   ON N.REPORT = M.REPORT
    --   AND N.ACCOUNT_NUMBER = M.ACCOUNT_NUMBER
    --WHERE M.ACCOUNT_NUMBER IS NULL   
    
    SELECT *
    FROM @MasterNotes
    
    注意:如果您曾经更新到SQL2008+,您可以按如下方式使用
    MERGE
    功能:

    DECLARE @NewNotes TABLE (REPORT VARCHAR(10), ACCOUNT_NUMBER INT, NOTES VARCHAR(50))
    DECLARE @MasterNotes TABLE (REPORT VARCHAR(10), ACCOUNT_NUMBER INT, NOTES VARCHAR(50))
    
    INSERT INTO @MasterNotes (REPORT, ACCOUNT_NUMBER, NOTES)
    SELECT 'ABC', 123, 'CUSTOMER IS VERY NICE, SOMETIMES...' UNION
    SELECT 'DEF', 456, 'CUSTOMER IS ANGRY'
    
    INSERT INTO @NewNotes (REPORT, ACCOUNT_NUMBER, NOTES)
    SELECT 'ABC', 123, 'CUSTOMER IS VERY NICE' UNION
    SELECT 'DEF', 456, 'CUSTOMER IS ANGRY' UNION
    SELECT 'GHI', 789, 'CUSTOMER WANTS CALL BACK'
    
    MERGE INTO @MasterNotes AS DST
    USING (SELECT REPORT, ACCOUNT_NUMBER, NOTES FROM @NewNotes) AS SRC
        ON SRC.ACCOUNT_NUMBER = DST.ACCOUNT_NUMBER
    WHEN MATCHED THEN UPDATE
        SET DST.REPORT = SRC.REPORT,
            DST.NOTES = SRC.NOTES
    WHEN NOT MATCHED THEN 
        INSERT (REPORT, ACCOUNT_NUMBER, NOTES)
        VALUES (SRC.REPORT, SRC.ACCOUNT_NUMBER, SRC.NOTES);
    
    SELECT *
    FROM @MasterNotes
    

    让我们看看你到目前为止都做了些什么!我们很乐意为您带来任何麻烦,但“为我编写代码”服务也不例外。。。。这首先需要你自己的努力!