在不违反主键的情况下插入行的最快方法
本文关键字:插入 方法 情况下 | 更新日期: 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 表中。