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

C#-将数据加载到SQL Server并合并(如果已经存在),c#,sql-server,merge,insert,insert-update,C#,Sql Server,Merge,Insert,Insert Update,假设SQL Server中有下表: MyTable: IDCol: Val1: Val2: 1 a b 2 c d ... 而且,我只能通过直接SQL语句访问/修改它(例如,这意味着我不能将文件放在某个位置并告诉它上载该文件) 因此,目前,在我的C#代码中,如果我想在这个表中插入值,我实际上在编写SQL,例如: INSERT INTO MyTable (IDCol, Col1, Col2) Values (.....

假设SQL Server中有下表:

MyTable:
IDCol:     Val1:    Val2:
1          a        b
2          c        d
...
而且,我只能通过直接SQL语句访问/修改它(例如,这意味着我不能将文件放在某个位置并告诉它上载该文件)

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

INSERT INTO MyTable (IDCol, Col1, Col2) Values (.....)
但现在我必须考虑表中已经存在值的可能性,如果存在,则更新该行

我知道我可以通过a来实现这一点,但如何通过直接SQL语句来实现呢

  • 我是否创建一个临时表,进行合并,然后删除它
  • 我是否查询已经匹配的行,更新它们,然后在剩余的行上进行插入
  • 有没有其他的SQL语法来做这样的事情呢
    而且,如果#1是正确的方法,我如何做到这一点,如果我有两个程序实例在运行,我就不会以相同的名称重复创建临时表?

    您可以按照建议使用merge命令,或者使用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列进行合并,并且假设您正在逐行触发insert,那么您有三个变量
    @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
    

    如果您使用的是ADO.net而不是DataAdapters,请检查此链接,非常感谢@rashfmnb,但在这种情况下我不能,实际上,我必须像在Management studio中键入SQL一样编写SQL,并且无法将文件上载到DB可以看到的位置。在这种情况下,您必须检查数据是否存在,然后运行更新查询,否则运行插入查询