【问题标题】:Update and table using Merge SQL使用 Merge SQL 更新和表
【发布时间】:2014-04-29 22:45:27
【问题描述】:

我有一个存储过程检查记录是否存在更新记录,如果不存在则插入记录。我正在使用合并。更新部分工作,但插入部分不工作。(名称和 AID 的组合是唯一的)。我的表中还有 _IdxIdentity(Auto increase) 键。我根本没有在我的插入语句中使用它我应该使用它吗?不知道如何使插入语句起作用,它不会给我任何错误,只是没有插入任何记录。

这是我的程序:

 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

这是代理表:

     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

【问题讨论】:

  • 我无法区分您帖子中的问题。
  • 错误消息和示例输入也可能会有所帮助。
  • 您要插入的内容。您从合并表生成源,当然,在插入部分您将获得空源。
  • @HamletHakobyan,如果表中不存在记录,我需要插入,那么我如何插入?
  • 你的源和目标不是同一个表。如果从同一个表中选择一条记录,什么时候不存在?

标签: sql


【解决方案1】:

如果我没看错,我认为您需要从以下内容开始:

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

【讨论】:

    猜你喜欢
    • 2018-03-11
    • 2013-02-11
    • 1970-01-01
    • 2013-01-26
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 2018-08-05
    相关资源
    最近更新 更多