- What's wrong with this T-SQL MERGE statement?
- IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TempUpsert]') )
- drop table TempUpsert;
- CREATE TABLE [dbo].[TempUpsert](
- [FirstName] [varchar](200) NOT NULL,
- [LastName] [varchar](200) NOT NULL,
- [Score] [int] NOT NULL
- ) ON [PRIMARY] ;
- CREATE TABLE [dbo].[Sales](
- [FullName] [varchar](200) NOT NULL,
- [LastName] [varchar](200) NOT NULL,
- [FirstName] [varchar](200) NOT NULL,
- [lastUpdated] [date] NOT NULL,
- CONSTRAINT [PK_Sales] PRIMARY KEY CLUSTERED
- (
- [FullName] ASC
- )
- ---- PROC
- CREATE PROCEDURE [dbo].[sp_MoveFromTempUpsert_to_Sales]
- (@HashMod int)
- AS
- BEGIN
- -- SET NOCOUNT ON added to prevent extra result sets from
- -- interfering with SELECT statements.
- SET NOCOUNT ON;
- MERGE Sales AS trget
- USING (
- SELECT
- --- Edit: Thanks to Mikal added DISTINCT
- DISTINCT
- FirstName, LastName , [Score], LastName+'.'+FirstName AS FullName
- FROM TempUpsert AS ups) AS src (FirstName, LastName, [Score], FullName)
- ON
- (
- src.[Score] = @hashMod
- AND
- trget.FullName=src.FullName
- )
- WHEN MATCHED
- THEN
- UPDATE SET trget.lastUpdated = GetDate()
- WHEN NOT MATCHED
- THEN INSERT ([FullName], [LastName], [FirstName], [lastUpdated])
- VALUES (FullName, src.LastName, src.FirstName, GetDate())
- OUTPUT $action, Inserted.*, Deleted.* ;
- --print @@rowcount
- END
- GO
- --- Insert dummie data
- INSERT INTO TempUpsert (FirstName, LastName, Score)
- VALUES ('John','Smith',2);
- INSERT INTO TempUpsert (FirstName, LastName, Score)
- VALUES ('John','Block',2);
- INSERT INTO TempUpsert (FirstName, LastName, Score)
- VALUES ('John','Smith',2); --make multiple on purpose
- ----- EXECUTE PROC
- GO
- DECLARE @return_value int
- EXEC @return_value = [dbo].[sp_MoveFromTempUpsert_to_Sales]
- @HashMod = 2
- SELECT 'Return Value' = @return_value
- GO
- MERGE Sales AS trget
- USING (
- SELECT FirstName, LastName, Score, LastName + '.' + FirstName AS FullName
- FROM TempUpsert AS ups
- WHERE Score = @hashMod
- GROUP BY FirstName, LastName, Score, LastName + '.' + FirstName
- ) AS src (FirstName, LastName, [Score], FullName)
- ON
- (
- -- src.[Score] = @hashMod
- --AND
- trget.FullName=src.FullName
- )
- WHEN MATCHED
- THEN
- UPDATE SET trget.lastUpdated = GetDate()
- WHEN NOT MATCHED
- THEN INSERT ([FullName], [LastName], [FirstName], [lastUpdated])
- VALUES (FullName, src.LastName, src.FirstName, GetDate())
- OUTPUT $action, Inserted.*, Deleted.* ;
- --print @@rowcount
- END