在不违反主键的情况下插入行的最快方法

本文关键字:插入 方法 情况下 | 更新日期: 2023-09-27 18:37:00

我有几个表,其中包含从 c# 填充的主键约束。

在不违反主键的情况下插入行的最快方法是什么?

逐个执行

语句与批处理执行语句会增加大量开销吗?

如果我需要根据条件更新某些行,我最好使用存储过程并逐点调用它还是使用合并?

1.

foreach(var point in points)
{
    ...
    sqlCommand.ExecuteNonQuery(@"
    BEGIN TRY 
        INSERT INTO POINTS ... 
    END TRY 
    BEGIN CATCH 
        IF ERROR_NUMBER() <> 2627 
        BEGIN 
            THROW 
        END
    END CATCH", con)
}

阿拉伯数字。

foreach(var point in points)
{
    ...
    sqlCommand.ExecuteNonQuery(@"
    IF NOT EXISTS (Select 1 from POINTS where ...) 
    INSERT INTO POINTS ...", con)
}

3.

StringBuilder sb = new StringBuilder();
sb.AppendLine("BEGIN TRAN");
foreach(var point in points)
{
    sb.AppendLine("IF NOT EXISTS (Select 1 from POINTS where ...) INSERT INTO POINTS ...")
}
sb.AppendLine("COMMIT TRAN");
sqlCommand.ExecuteNonQuery(sb.ToString());

4.

StringBuilder sb = new StringBuilder();
sb.AppendLine(@"
    BEGIN TRAN
    DECLARE @POINTS TABLE (
    ...
    )
");
foreach(var point in points)
{
    sb.AppendLine("INSERT INTO @POINTS ...")
}
sb.AppendLine(@"
    MERGE POINTS as T
    USING @POINTS as S
    ON T.KEY=S.KEY
    WHEN OT MATCHED THEN
    INSERT ...
");
sb.AppendLine("COMMIT TRAN");
sqlCommand.ExecuteNonQuery(sb.ToString());

在不违反主键的情况下插入行的最快方法

如果您的积分集合很大,请考虑使用 SqlBulkCopy 将其插入到临时表中(例如 #NEW_POINTS )首先。这样,您将避免每个点运行单独的 INSERT 语句。

然后,运行单个合并或插入/更新的组合,将数据移动到实际的 POINTS 表中。