gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:28:40 24 4
gpt4 key购买 nike

我有几个带有主键约束的表,这些表是从 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)
}

2.

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 语句。

然后,运行单个 MERGE 或 INSERT/UPDATE 的组合以将数据移动到实际的 POINTS 表中。

关于c# - 在不违反主键的情况下插入行的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27883518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com