关于c#:Sql Server如果表中有项目,则返回bool

Sql Server Return bool if item is available in table

本问题已经有最佳答案,请猛点这里访问。

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

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

在我的脑海中,我有一个方法,通过给定的FoldingIDClient_ID选择所有数据,看看dataset是否有0行,那么数据就不存在于表中。 但建议我检查那个最简单可靠的方法..


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

1
2
3
4
5
6
7
8
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版本,则可以通过执行以下操作来实现"长途"的相同目标。

1
2
3
4
5
6
7
8
9
10
11
12
13
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

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


手动检查,

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