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,现在可以正常工作。