Inserção em massa da lista de C # no SQL Server em várias tabelas com restrições de chave estrangeira
Estou completamente ignorante com este problema, qualquer ajuda seria muito apreciada:
Eu tenho duas tabelas, uma é a tabela de dados mestre (Table A
), a outra tabela (Table B
) possui um relacionamento de chave estrangeira com várias entradas (para ser específico 18) para uma entrada emTable A
.
Estou recebendo os dados em uma lista e desejo inseri-los no banco de dados do SQL Server.
Atualmente, estou usando o padrão abaixo, mas está tomando14 minutos para inserir 100 linhas emTable A
e correspondentes 18 * 100 linhas emTable B
.
using (SqlConnection conn = new SqlConnection(conStr))
{
foreach (var ticket in Tickets)
{
sql = string.Format(@"INSERT INTO dbo.Tickets([ColumnA], [ColumnB] ,..." + @")
VALUES(@ColumnA, @ColumnB,@ColumnC, @ColumnD, .... +
@"SELECT SCOPE_IDENTITY();");
using (cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@ColumnA", (object)ticket.Id ?? DBNull.Value);
cmd.Parameters.AddWithValue("@ColumnB", (object)ticket.Address ?? DBNull.Value);
cmd.Parameters.AddWithValue("@ColumnC", (object)ticket.Status?? DBNull.Value);
....
conn.Open();
TableA_TicketId = Convert.ToInt32(cmd.ExecuteScalar());
}
}
}
eu usoSCOPE_IDENTITY()
para obter a identidade mais recente da tabela A para cada registro inserido e usá-la para inserção na segunda tabela
sql = string.Format(@"INSERT INTO Tickets_Fields ([TableA_TicketId], [FieldName], [Key],[Value])
VALUES (@TableA_TicketId, @FieldName, @Key, @Value);");
using (cmd = new SqlCommand(sql, conn))
{
foreach (var customField in ticket.CustomFields)
{
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@TableA_TicketId", (object)TicketId ?? DBNull.Value);
cmd.Parameters.AddWithValue("@FieldName", (object)"CustomField" ?? DBNull.Value);
...
cmd.ExecuteNonQuery();
}
}
conn.Close();
Por favor, sugira se eu posso melhorar o desempenho deste código por qualquer meio. Ou existe alguma maneira melhor / mais rápida de fazê-lo?