SQL Server 如果表中有可用的项,则返回布尔值
本文关键字:布尔值 返回 如果 Server SQL | 更新日期: 2023-09-27 18:34:27
我的database
中有一个名为tblStockManagement
的表。 我有两列名为 Client_ID
和 FoldingID
。
我想在列中插入值,但首先检查该值是否已存在于表中。 因为那样我将更新项目的quantity
,而不是在表中创建新行。
我想到的方法是按给定的foldingID
和Client_ID
选择所有数据,看看dataset
是否有 0 行,那么表中已经不存在数据。 但建议我任何最简单和可靠的方法来检查它。
有一种常见的模式称为 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,则不要添加新的,否则,添加新的...