【问题标题】:Sql Server Return bool if item is available in table [duplicate]如果项目在表中可用,则Sql Server返回布尔值[重复]
【发布时间】:2016-05-25 02:32:09
【问题描述】:

我的database 中有一个名为tblStockManagement 的表。我有两列名为Client_IDFoldingID

我想向列中插入值,但首先检查该值是否已存在于表中。因为那时我将更新项目的quantity,而不是在表中创建新行。

我有办法通过给定的foldingIDClient_ID 选择所有数据,并查看dataset 是否有0 行,然后数据不存在于表中。但建议我任何最简单可靠的方法来检查..

【问题讨论】:

    标签: c# sql sql-server


    【解决方案1】:

    有一种常见的模式,称为 UPSERT。在 Sql Server 中,您使用 the MERGE statement 执行 UPSERT。

    MERGE tblStockManagement AS target
        USING (SELECT @clientID, @foldingId, @quantity) AS source (clientID, foldingID, quantity)
        ON (target.clientID = source.clientID AND target.foldingID = source.foldingID)
    WHEN MATCHED THEN 
        UPDATE SET quantity = source.quantity
    WHEN NOT MATCHED THEN
        INSERT (clientID, foldingID, quantity)
        VALUES (source.clientID, source.foldingID, source.quantity);
    

    【讨论】:

      【解决方案2】:

      正如 Joel 在他的回答中所说,这是 SQL 中的一个正常问题,称为 UPSERT。但是,如果您使用的 Sql Server 版本无法访问 MERGE(2005 或更早版本),则可以通过执行以下操作“长期”实现相同的目标。

      BEGIN TRANSACTION
      IF EXISTS(SELECT 1 FROM tblStockManagement WITH (UPDLOCK, HOLDLOCK) WHERE clientID = @clientID and foldingID = @foldingID)
      BEGIN
          UPDATE tblStockManagement 
              SET quantity = @quantity 
              WHERE clientID = @clientID and foldingID = @foldingID
      END
      ELSE
      BEGIN
          INSERT INTO tblStockManagement (clientID, foldingID, quantity)
              VALUES (@clientID, @foldingID, @quantity);
      END
      COMMIT
      

      在选择上执行WITH (UPDLOCK, HOLDLOCK) 非常重要,如果您忘记了它,您可能会得到无法保护您免于插入重复行或可能导致死锁的查询(取决于您设置的数据库隔离级别用于连接)。

      【讨论】:

        【解决方案3】:

        手动检查,

        首先,检查数据库中是否存在Client_ID和FoldingID,如果entry != null,则不要添加新的,否则,添加新的...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-07
          • 1970-01-01
          • 2023-03-28
          • 1970-01-01
          • 2010-11-30
          相关资源
          最近更新 更多