在具有特定要求的 SQL 服务器中更新或插入

UPDATE or INSERT in SQL Server with specific requirements

我需要将记录插入 table,如下所示:

CREATE TABLE [dbo].[ExamFees]
(
    [ExamSeriesID] [int] NOT NULL,
    [Region] [varchar](50) NOT NULL,
    [Fee] [money] NOT NULL,
    [DatetimeEntered] [datetime] NULL
)

但是,如果记录已经存在,那么我只想将 DatetimeEntered 设置为 GETDATE()。

我想我需要使用合并,但我不确定如何执行此操作,并且被告知如果我不知道自己在做什么,我可能会丢失数据。

一些示例数据是:

INSERT INTO ExamFees([ExamSeriesID], [Region], [Fee], [DatetimeEntered]) VALUES(553, 'Low', 10.00, GETDATE())
INSERT INTO ExamFees([ExamSeriesID], [Region], [Fee], [DatetimeEntered]) VALUES(553, 'Lower mid', 20.00, GETDATE())
INSERT INTO ExamFees([ExamSeriesID], [Region], [Fee], [DatetimeEntered]) VALUES(553, 'Upper mid', 30.00, GETDATE())
INSERT INTO ExamFees([ExamSeriesID], [Region], [Fee], [DatetimeEntered]) VALUES(553, 'High', 40.00, GETDATE())
INSERT INTO ExamFees([ExamSeriesID], [Region], [Fee], [DatetimeEntered]) VALUES(401, 'Low', 5.00, GETDATE())
INSERT INTO ExamFees([ExamSeriesID], [Region], [Fee], [DatetimeEntered]) VALUES(401, 'Lower mid', 10.00, GETDATE())
INSERT INTO ExamFees([ExamSeriesID], [Region], [Fee], [DatetimeEntered]) VALUES(401, 'Upper mid', 15.00, GETDATE())
INSERT INTO ExamFees([ExamSeriesID], [Region], [Fee], [DatetimeEntered]) VALUES(401, 'High', 20.00, GETDATE())

值得一提的是,这也将从 C# 程序调用。

SQL 大量生成并添加到 StringBuilder,如下所示:

string Region = "Low";

string ExamFeesTableName = "ExamFees";

sb.AppendLine("INSERT INTO " + ExamFeesTableName + "([ExamSeriesID], [Region], [Fee], [DatetimeEntered]) VALUES(" + ExamSeriesID + ", '" + Region + "', " + Fee.ToString("0.00") + ", GETDATE())");

有人能帮忙吗?

我建议选择类似于以下方法之一的策略:

方法一

IF EXISTS (SELECT * FROM ExamFees WHERE ExamSeriesID='553' and Region = 'Low')
    UPDATE ExamFees SET DatetimeEntered = GETDATE() WHERE ExamSeriesID='553' and Region = 'Low'
ELSE
    INSERT INTO ExamFees([ExamSeriesID], [Region], [Fee], [DatetimeEntered]) VALUES('553', 'Low', 10.00, GETDATE())

方法二

UPDATE ExamFees SET DatetimeEntered = GETDATE() WHERE ExamSeriesID='553' and Region = 'Low'
IF @@ROWCOUNT=0
        INSERT INTO ExamFees([ExamSeriesID], [Region], [Fee], [DatetimeEntered]) VALUES('553', 'Low', 10.00, GETDATE())

这些示例基于您的第一个 INSERT 语句,每个 INSERT 语句都需要重复。