Sql server 2008 向上插入一个范围

Sql server 2008 向上插入一个范围,sql-server-2008,upsert,Sql Server 2008,Upsert,我知道这一点: IF EXISTS (SELECT * FROM table WHERE pk = @pk) BEGIN --Update END ELSE BEGIN --INSERT END 但这只适用于一行。假设我有一个表min\u max M和一个临时表\u MinMaxImport T。我想将从T插入到M,但是更新当对分支\u no/产品已经存在于M中时 插入: INSERT INTO min_max (user_no, branch_no, product,

我知道这一点:

IF EXISTS (SELECT * FROM table WHERE pk = @pk)
BEGIN
   --Update
END
ELSE
BEGIN 
   --INSERT
END
但这只适用于一行。假设我有一个表
min\u max M
和一个临时表
\u MinMaxImport T
。我想
从T插入到M,但是
更新
当对
分支\u no
/
产品
已经存在于M中时

插入:

INSERT INTO min_max
    (user_no, branch_no, product, min_stock, max_stock)
SELECT
    @user_no, _branch_no, _product, _min_stock, _max_stock
FROM 
    traxs_temp..__MinMaxImport 
WHERE 
    session_id = @session_id
更新:

UPDATE min_max SET
    date_time = GETDATE(),
    user_no = @user_no,
    min_stock = _min_stock,
    max_stock = _max_stock
FROM
    min_max M
    INNER JOIN traxs_temp..__MinMaxImport T ON T._product = M.product 
AND T._branch_no = M.branch_no
WHERE 
    session_id = @session_id
这样做的最佳解决方案是什么?我读过关于合并的文章,但我不知道如何使用它。

应该能做到

MERGE INTO min_max
USING
(
    SELECT
        @user_no AS _user_no, _branch_no, _product, _min_stock, _max_stock
    FROM 
        traxs_temp..__MinMaxImport 
    WHERE 
        session_id = @session_id    
) AS Src
ON
    (min_max.branch_no = Src._branch_no) AND
    (min_max.product = Src._product)
WHEN MATCHED THEN 
UPDATE SET 
    date_time = GETDATE(),
    user_no = Src._user_no,
    min_stock = Src._min_stock,
    max_stock = Src._max_stock
WHEN NOT MATCHED BY TARGET THEN 
INSERT 
    (user_no, branch_no, product, min_stock, max_stock)
VALUES
    (Src._user_no,
    Src._branch_no,
    Src._product,
    Src._min_stock,
    Src._max_stock)
;

MERGE
应该能够做到这一点。查找语法需要一些时间。我有一个错误:
关键字“INTO”附近的语法不正确。
看起来像是SQL Server 2008中添加了
MERGE
。你用什么版本?为您的问题添加一个合适的标记。我使用的是SQL Server 2008,但这似乎是由于兼容级别默认为90,应该是100造成的。@ArthurRey,是的,这肯定是原因。我在2008年使用了
MERGE
,数据库是在2008年创建的,所以它的兼容性级别是100。那些在2005年创建并升级到2008年的数据库可能会保留其以前的兼容级别,因此您必须更改它。我将兼容级别更改为100,现在可以正常工作。