I have a store procedure that is checking if record existed update the record and if not it should insert the record. I am using Merge. The update part is working but insert part is not working.(combination of Name and AID are unique). There is _IdxIdentity(Auto increasing) key also in my table. I haven't use it in my insert statement at all should I use it? Not sure how to make the insert statement work, it does not give me any error just not inserting any record.
this is my procedure:
Create PROCEDURE [dbo].[insert_Or_Update_Agency]
@AID INT
,@_IsActive bit
,@Name varchar(40) = NULL
,@Description varchar(200)= NULL
,@ContactPhone varchar(50) = NULL
,@ContactName varchar(100)= NULL
,@ContactEmail varchar(100)= NULL
,@Country varchar(50) = NULL
,@Street varchar(100)= NULL
,@City varchar(100)= NULL
,@State varchar(50) = NULL
,@zipCode varchar(50) = NULL
AS
BEGIN
SET NOCOUNT ON;
Merge Agency USING
(Select * from Agency WHERE _IsActive = 1
and Name = @Name and AID=@AID) as Source
on Agency.Name= Source.Name and Agency.AID=Source.AID
when MATCHED
THEN Update
SET
_IsActive = COALESCE(@_IsActive,Source._IsActive)
,Name =COALESCE(@Name,Source.Name)
,[Description]=COALESCE(@Description,Source.Description)
,ContactPhone=COALESCE(@ContactPhone,Source.ContactPhone)
,ContactName=COALESCE(@ContactName,Source.ContactName)
,ContactEmail=COALESCE(@ContactEmail,Source.ContactEmail)
,Country=COALESCE(@Country,Source.Country)
,Street=COALESCE(@Street,Source.Street)
,City=COALESCE(@City,Source.City)
,[State]=COALESCE(@State,Source.State)
,zipCode=COALESCE(@zipCode,Source.zipCode)
WHEN NOT MATCHED
Then
Insert
(
AID
,_IsActive
,Name
,[Description]
,ContactPhone
,ContactName
,ContactEmail
,Country
,Street
,City
,[State]
,zipCode
)
VALUES
( @AID
,@_IsActive
,@Name
,@Description
,@ContactPhone
,@ContactName
,@ContactEmail
,@Country
,@Street
,@City
,@State
,@zipCode
);
END
and this is Agency Table:
CREATE TABLE [dbo].[Agency](
[_IdxIdentity] [bigint] IDENTITY(1,1) NOT NULL,
[_RowIdentity] [uniqueidentifier] NOT NULL,
[_DateTimeInserted] [datetime] NOT NULL,
[_DateTimeModified] [datetime] NOT NULL,
[_Partitioner] [int] NULL,
[_IsActive] [bit] NOT NULL,
[Name] [varchar](40) NULL,
[AID] [bigint] NULL
) ON [PRIMARY]
SET ANSI_PADDING ON
ALTER TABLE [dbo].[Agency] ADD [Description] [varchar](200) NULL
ALTER TABLE [dbo].[Agency] ADD [ContactPhone] [varchar](50) NULL
ALTER TABLE [dbo].[Agency] ADD [ContactName] [varchar](100) NULL
ALTER TABLE [dbo].[Agency] ADD [ContactEmail] [varchar](100) NULL
ALTER TABLE [dbo].[Agency] ADD [Country] [varchar](50) NULL
ALTER TABLE [dbo].[Agency] ADD [Street] [varchar](100) NULL
ALTER TABLE [dbo].[Agency] ADD [City] [varchar](100) NULL
ALTER TABLE [dbo].[Agency] ADD [State] [varchar](50) NULL
ALTER TABLE [dbo].[Agency] ADD [zipCode] [varchar](50) NULL
CONSTRAINT [PK_Agency] PRIMARY KEY CLUSTERED
(
[_IdxIdentity] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[Agency] ADD CONSTRAINT [DF_Agency__RowIdentity] DEFAULT (newid()) FOR [_RowIdentity]
GO
ALTER TABLE [dbo].[Agency] ADD CONSTRAINT [DF_Agency__DateTimeInserted] DEFAULT (getdate()) FOR [_DateTimeInserted]
GO
ALTER TABLE [dbo].[Agency] ADD CONSTRAINT [DF_Agency__DateTimeModified] DEFAULT (getdate()) FOR [_DateTimeModified]
GO
ALTER TABLE [dbo].[Agency] ADD CONSTRAINT [DF_Agency__IsActive] DEFAULT ((1)) FOR [_IsActive]
GO
If I'm reading all that correctly I think you need to start with something like:
MERGE Agency
USING (SELECT @Name,@Aid) AS source (Name,Aid)
ON ( Agency.Name= Source.Name
AND Agency.AID=Source.AID
AND _IsActive = 1)
WHEN MATCHED THEN
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.