【问题标题】:C# - Load data into SQL Server and merge if already presentC# - 将数据加载到 SQL Server 并合并(如果已经存在)
【发布时间】:2016-07-28 14:23:04
【问题描述】:

假设我在 SQL Server 中有下表:

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

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

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

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

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

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

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

而且,如果 #1 是正确的方法,我该如何做到这一点,如果我的程序有 2 个实例正在运行,我不会双重创建同名的临时表?

【问题讨论】:

  • 如果您使用 ADO.net 而不是使用 DataAdapters,请检查此链接 msdn.microsoft.com/en-us/library/33y2221y(v=vs.110).aspx
  • 很高兴知道,谢谢@rashfmnb,但在这种情况下我不能,我实际上必须编写SQL,就好像它被输入到管理工作室并且没有上传的能力文件到数据库可以看到的地方。
  • 在这种情况下,您必须检查数据是否存在,如果存在则运行更新查询,否则运行插入查询

标签: c# sql-server merge insert insert-update


【解决方案1】:

假设您正在基于 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

【讨论】:

    【解决方案2】:

    您可以按照您的建议使用合并命令,也可以像这样使用 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 2014-12-06
      • 1970-01-01
      • 2014-03-15
      相关资源
      最近更新 更多