C# - 将数据加载到 SQL 服务器并合并(如果已经存在)

C# - Load data into SQL Server and merge if already present

假设我在 SQL 服务器中有以下 table:

MyTable:
IDCol:     Val1:    Val2:
1          a        b
2          c        d
...

而且,我只能通过直接 SQL 语句访问/修改它(例如,这意味着我不能将文件放在某个位置并告诉它上传该文件)

因此,目前,在我的 C# 代码中,如果我想将值插入此 table,我实际上正在编写 SQL,例如:

INSERT INTO MyTable (IDCol, Col1, Col2) Values (.....)

但现在我必须考虑 table 中已经存在值的可能性,如果存在,则更新该行。

我知道我可以通过 Merge 来做到这一点,但我如何通过直接 SQL 语句来做到这一点?

  1. 我是否创建一个临时文件 table,进行合并,然后将其删除?
  2. 我是否查询已经匹配的行,更新它们,然后对剩余行进行插入?
  3. 是否有某种其他 SQL 语法来做这样的事情?

而且,如果 #1 是正确的方法,我该怎么做,如果我有 2 个程序实例 运行,我不会重复创建一个临时 table同名?

您可以按照您的建议使用合并命令,或者像这样使用 if exists:

IF EXISTS(SELECT * FROM myTable WHERE Id = @id)
UPDATE myTable SET x = @x WHERE Id = @id
ELSE
INSERT INTO myTable (Id, x) VALUES (@id, @x)

假设您正在根据 ID 列进行合并,并假设您正在逐行触发插入,因此您有三个变量 @idcol, @col1, @col2,然后使用以下查询

--DECLARE @IDCol int
--DECLARE @Col1 varchar(10), @Col2 varchar(10)
--SET @IDcol=2
--SET @Col1='A'
--SET @col2='C'

IF NOT EXISTS( SELECT 1 FROM MyTable WHERE IDCol=@IDCol)
BEGIN
INSERT INTO MyTable (IDCol, Col1, Col2) Values (@IDcol,@col1,@col2)
END
ELSE
BEGIN
UPDATE MyTable
SET Col1= @Col1, Col2=@Col2
WHERE IDCol=@IDCol
END

--SELECT * from MyTable

SQl demo link