SQL Server 如果表中有可用的项,则返回布尔值

本文关键字:布尔值 返回 如果 Server SQL | 更新日期: 2023-09-27 18:34:27

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

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

我想到的方法是按给定的foldingIDClient_ID选择所有数据,看看dataset是否有 0 行,那么表中已经不存在数据。 但建议我任何最简单和可靠的方法来检查它。

SQL Server 如果表中有可用的项,则返回布尔值

有一种常见的模式称为 UPSERT。在 Sql Server 中,使用 MERGE 语句执行 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);

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

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)非常重要,如果您忘记了它,则最终可能会得到无法防止插入重复行或可能导致死锁的查询(取决于您为连接设置的数据库隔离级别)。

手动检查,

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