upsert sql查询
问题描述:
我正在寻找一些建议如何优化情侣sql存储过程。 对于第一个查询,我正在进行插入操作,如果数据存在,则使用第二个查询进行更新。 我想要做的是将两个存储过程合并为一个,其中查询将检查数据是否存在,而不是更新,否则插入一个新行。 这是我在这个时候:upsert sql查询
更新SP:
ALTER PROCEDURE [dbo].[UpdateStep1](@UserId nvarchar(50), @First_Name nvarchar(50), @Last_Name nvarchar(50),
@TitlePosition nvarchar(30))
AS
BEGIN
UPDATE Company_Information
SET First_Name = @First_Name,
Last_Name = @Last_Name,
[email protected],
WHERE UserId = @UserId
END
插入SP:
ALTER PROCEDURE [dbo].[InsertStep1](@UserId nvarchar(50), @First_Name nvarchar(50), @Last_Name nvarchar(50),
@TitlePosition nvarchar(30))
AS
BEGIN
INSERT INTO Company_Information(UserId,
First_Name,
Last_Name,
Title_Position)
VALUES
(@UserId,
@First_Name,
@Last_Name,
@TitlePosition)
END
所以,我想在一个合并这两个SP和SP来检查是否已有该UserId的数据而不是更新,否则插入一个新行。 有人可以帮助我这个。 感谢和节日快乐大家,Laziale
答
CREATE PROCEDURE [dbo].[MERGEStep1](@UserId nvarchar(50), @First_Name nvarchar(50), @Last_Name nvarchar(50), @TitlePosition nvarchar(30))
AS
BEGIN
MERGE Company_Information WITH(HOLDLOCK) AS T
USING(SELECT 1 S) S
ON T.UserId = @UserId
WHEN MATCHED THEN UPDATE SET
First_Name = @First_Name,
Last_Name = @Last_Name,
[email protected]
WHEN NOT MATCHED THEN
INSERT (UserId, First_Name, Last_Name, Title_Position)
VALUES(@UserId, @First_Name,@Last_Name,@TitlePosition);
END
答
遵循以下步骤:
- 创建一个变量来测试它(例如:@id)
- 选择@id =用户ID来自Company_Information其中UserId = @UserId
- 如果@id = @userId更新,否则插入
作为@gbn指定,请注意concurrence issues。
+1 [可能需要HOLDLOCK'](http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx) – 2012-01-02 14:03:22
@MartinSmith Yep ,同意 – 2012-01-02 14:04:05
感谢您的帮助。这是完美的 – Laziale 2012-01-02 16:28:07