在表之间插入数据的存储过程

时间:2018-01-10 15:24:28

标签: sql sql-server stored-procedures

我想将名为temp_menu的表中的数据插入另一个名为menu的表中。

它们具有相同的结构,它们存储相同的数据,我想创建一个存储过程来检查表之间的差异。如果有任何不同的行且表menu中不存在行,我想将它们插入menu;如果行存在,如果menu列高于DateReg表中的DateReg列,我想更新temp_menu中的行。

表格具有以下结构:

CREATE TABLE [dbo].[Menu_Temp]
(
    [Date] [datetime] NOT NULL,
    [Ref] [int] NOT NULL,
    [Art] [char](60) NOT NULL,
    [Dish] [char](60) NOT NULL,
    [DateReg] [datetime] NOT NULL,
    [Zone] [char](60) NOT NULL,
);

我有这段代码来检查表之间的差异:

SELECT * 
INTO #diffs
FROM [Regi].dbo.menu
EXCEPT
SELECT * FROM [Regi].dbo.menu_Temp

IF @@ROWCOUNT = 0
    RETURN

SELECT * FROM #diffs

1 个答案:

答案 0 :(得分:1)

详细信息如下:https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql

您的情况的一个例子可能是......

MERGE
    [Regi].dbo.menu
USING
    [Regi].dbo.menu_Temp
        ON (menu_Temp.[Ref] = menu.[Ref])  -- Assumes [Ref] is the identifying column?
WHEN
    MATCHED AND (menu_Temp.[DateReg] > menu.[DateReg])
THEN
    UPDATE SET [Art]     = menu_Temp.[Art],
               [Dish]    = menu_Temp.[Dish],
               [Zone]    = menu_Temp.[Zone],
               [Date]    = menu_Temp.[Date],
               [DateReg] = menu_Temp.[DateReg]
WHEN
    NOT MATCHED
THEN  
    INSERT (
        [Date],
        [Ref],
        [Art],
        [Dish],
        [DateReg],
        [Zone]
    )
    VALUES (
        menu_Temp.[Date],
        menu_Temp.[Ref],
        menu_Temp.[Art],
        menu_Temp.[Dish],
        menu_Temp.[DateReg],
        menu_Temp.[Zone]
    )

http://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=b47d7e879856ffe6210589f6bb64829f