如何排除存储过程写入重复记录?
有个表如下:
CREATE TABLE [dbo].[T_FillingRec]( [FillingRec] [uniqueidentifier] NOT NULL, [Organize] [varchar](16) NULL, [SerialPort] [int] NULL, [Sequence] [bigint] NULL, [BUTime] [datetime] NULL, [BUUserName] [varchar](32) NULL, CONSTRAINT [T_Gas_FillingRec_PK] PRIMARY KEY CLUSTERED ( [FillingRec] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]
Create PROCEDURE [dbo].[pro_T_FillingRec1_Insert] @FillingRec uniqueidentifier, @Organize varchar(16), @SerialPort int, @Sequence bigint, @BUTime datetime, @BUUserName varchar(32)ASSET NOCOUNT ONIF EXISTS(SELECT * FROM [dbo].[T_FillingRec1] WHERE SerialPort = @SerialPort And Sequence = @Sequence)BEGIN UPDATE [dbo].[T_FillingRec1] SET [Organize] = @Organize, [BUTime] = @BUTime, [BUUserName] = @BUUserName WHERE SerialPort = @SerialPort And Sequence = @SequenceENDELSEBEGIN Set @FillingRec = NEWID() INSERT INTO [dbo].[T_FillingRec1] ([FillingRec],[Organize],[SerialPort],[Sequence],[BUTime],[BUUserName]) Select @FillingRec,@Organize,@SerialPort,@Sequence,@BUTime,@BUUserNameEND
--如果你的系统是2008的,那么使用merge将是完美方案IF EXISTS(SELECT * FROM [dbo].[T_FillingRec1] WHERE SerialPort = @SerialPort And Sequence = @Sequence)BEGIN UPDATE [dbo].[T_FillingRec1] SET [Organize] = @Organize, [BUTime] = @BUTime, [BUUserName] = @BUUserName WHERE SerialPort = @SerialPort And Sequence = @SequenceENDELSEBEGIN Set @FillingRec = NEWID() INSERT INTO [dbo].[T_FillingRec1] ([FillingRec],[Organize],[SerialPort],[Sequence],[BUTime],[BUUserName]) Select @FillingRec,@Organize,@SerialPort,@Sequence,@BUTime,@BUUserNameENDMERGE dbo.[T_FillingRec1] AS TargetUSING (SELECT SerialPort, Sequence,[BUTime],[BUUserName],[Organize] from xxx /*所有的新值*/) AS SourceON (Target.SerialPort = Source.SerialPort AND Target.Sequence = Source.Sequence)WHEN MATCHED THEN UPDATE SET Target.[BUTime] = Source.[BUTime], Target.[BUUserName] = Source.[BUUserName], Target.[Organize] = Source.[Organize],WHEN NOT MATCHED BY TARGET THEN INSERT ([FillingRec],[Organize],[SerialPort],[Sequence],[BUTime],[BUUserName]) VALUES (Source.[FillingRec], Source.[Organize], Source.[SerialPort], Source.[Sequence], Source.[BUTime], Source.[BUUserName]);
[解决办法]
--只是下面这段MERGE dbo.[T_FillingRec1] AS TargetUSING (SELECT SerialPort, Sequence,[BUTime],[BUUserName],[Organize] from xxx /*所有的新值*/) AS SourceON (Target.SerialPort = Source.SerialPort AND Target.Sequence = Source.Sequence)WHEN MATCHED THEN UPDATE SET Target.[BUTime] = Source.[BUTime], Target.[BUUserName] = Source.[BUUserName], Target.[Organize] = Source.[Organize],WHEN NOT MATCHED BY TARGET THEN INSERT ([FillingRec],[Organize],[SerialPort],[Sequence],[BUTime],[BUUserName]) VALUES (Source.[FillingRec], Source.[Organize], Source.[SerialPort], Source.[Sequence], Source.[BUTime], Source.[BUUserName]);
[解决办法]
不需要什么改进的
@FillingRec uniqueidentifier,
这个不应该是输入参数
应该在存储过程内部定义
AS
declare @FillingRec uniqueidentifier
set @FillingRec =newid()
[解决办法]
可以不用判断直接更新,因为判断 符合条件了还要去更新
这样直接去更新,返回受影响的行数,行数为0就是不满足条件
然后就insert
Create PROCEDURE [dbo].[pro_T_FillingRec1_Insert] @FillingRec uniqueidentifier, @Organize varchar(16), @SerialPort int, @Sequence bigint, @BUTime datetime, @BUUserName varchar(32)ASSET NOCOUNT ONdeclare @FillingRec uniqueidentifierset @FillingRec =newid()UPDATE [dbo].[T_FillingRec1] SET [Organize] = @Organize, [BUTime] = @BUTime, [BUUserName] = @BUUserName WHERE SerialPort = @SerialPort And Sequence = @Sequenceif @@rowcount=0INSERT INTO [dbo].[T_FillingRec1] ([FillingRec],[Organize],[SerialPort],[Sequence],[BUTime],[BUUserName]) Select @FillingRec,@Organize,@SerialPort,@Sequence,@BUTime,@BUUserName