我在物理C#代码中尝试捕获,当错误累积时跳过此插入过程并继续循环以填充数据库。然而,这是糟糕的编码实践。
所以我想在下面的存储过程中添加一个IF
语句,如果主键已经存在,它将跳过。我的主键是@id
。
我该如何解决这个问题?
CREATE PROCEDURE InsertProc
(
@id int,
@to nvarchar(100),
@from nvarchar(100),
@subject nvarchar(100),
@date datetime
)
AS
INSERT INTO Emails_Log (Email_ID, e_To, e_From, e_Subject, e_Date)
VALUES (@id, @to, @from, @subject, @date)
答案 0 :(得分:4)
CREATE PROCEDURE InsertProc
(
@id int,
@to nvarchar(100),
@from nvarchar(100),
@subject nvarchar(100),
@date datetime
)
AS
IF NOT EXISTS (SELECT NULL FROM Emails_Log
WHERE Email_ID = @ID)
BEGIN
INSERT INTO Emails_Log (Email_ID, e_To, e_From, e_Subject, e_Date)
VALUES (@id, @to, @from, @subject, @date)
END
如果您确实想要更新记录(如果已经存在)并插入(如果不存在),则模式如下:
CREATE PROCEDURE InsertProc
(
@id int,
@to nvarchar(100),
@from nvarchar(100),
@subject nvarchar(100),
@date datetime
)
AS
UPDATE Emails_Log
SET e_To = @to,
e_From = @from,
e_Subject = @subject,
e_Date = @date
WHERE Email_ID = @ID
-- If there was no update it means that @ID does not exist,
-- So we proceede with insert
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO Emails_Log (Email_ID, e_To, e_From, e_Subject, e_Date)
VALUES (@id, @to, @from, @subject, @date)
END
答案 1 :(得分:1)
CREATE PROCEDURE InsertProc
(
@id int,
@to nvarchar(100),
@from nvarchar(100),
@subject nvarchar(100),
@date datetime
)
AS
IF EXISTS(SELECT * From Emails_Log Where Email_ID = @id)
UPDATE Emails_Log (Email_ID, e_To, e_From, e_Subject, e_Date)
SET e_To = @to, e_From = @from, e_Subject = @subject, e_Date = @date
WHERE Email_ID = @id
ELSE
INSERT INTO Emails_Log (Email_ID, e_To, e_From, e_Subject, e_Date)
VALUES (@id, @to, @from, @subject, @date)
另一种方法是使用MERGE命令。
答案 2 :(得分:1)
您可以检查表格中是否存在记录 将记录插入一个陈述中。
答案 3 :(得分:0)
试试这段代码
CREATE PROCEDURE InsertProc
(
@id int,
@to nvarchar(100),
@from nvarchar(100),
@subject nvarchar(100),
@date datetime
)
AS
IF NOT EXISTS (SELECT Email_ID From Emails_Log Where Email_ID = @id)
BEGIN
INSERT INTO Emails_Log (Email_ID, e_To, e_From, e_Subject, e_Date)
VALUES (@id, @to, @from, @subject, @date)
END