SQL Вставляет одну строку или несколько данных строк?

Я никогда не заставлял вышеуказанные решения работать на коробке, к которой у меня есть доступ. Для одного типа был установлен (делает то, что делает больше). Так что встроенная директива необходима. Эта команда работает для меня:

if [ `builtin type -p vim` ]; then echo "TRUE"; else echo "FALSE"; fi
9
задан Andy Lester 9 October 2010 в 04:29
поделиться

5 ответов

Actually, the way you have it written, your first option will be faster.

  1. Your second example has a problem in it. You are doing sql = + sql + etc. This is going to cause a new string object to be created for each iteration of the loop. (Check out the StringBuilder class). Technically, you are going to be creating a new string object in the first instance too, but the difference is that it doesn't have to copy all the information from the previous string option over.

  2. The way you have it set up, SQL Server is going to have to potentially evaluate a massive query when you finally send it which is definitely going to take some time to figure out what it is supposed to do. I should state, this is dependent on how large the number of inserts you need to do. If n is small, you are probably going to be ok, but as it grows your problem will only get worse.

Bulk inserts are faster than individual ones due to how SQL server handles batch transactions. If you are going to insert data from C# you should take the first approach and wrap say every 500 inserts into a transaction and commit it, then do the next 500 and so on. This also has the advantage that if a batch fails, you can trap those and figure out what went wrong and re-insert just those. There are other ways to do it, but that would definately be an improvement over the two examples provided.

var iCounter = 0;
foreach (Employee item in employees)
{

   if (iCounter == 0)
  {
    cmd.BeginTransaction;
  }
  string sql = @"INSERT INTO Mytable (id, name, salary) 
    values ('@id', '@name', '@salary')";
  // replace @par with values
  cmd.CommandText = sql; // cmd is IDbCommand
  cmd.ExecuteNonQuery();
  iCounter ++;
  if(iCounter >= 500)
  {
     cmd.CommitTransaction;
     iCounter = 0;
  }
}

if(iCounter > 0)
   cmd.CommitTransaction;
14
ответ дан 4 December 2019 в 12:20
поделиться

посмотрите этот поток , Я ответил там о параметре со значением таблицы.

0
ответ дан 4 December 2019 в 12:20
поделиться

Размер пакета для запроса SQL Server указан как 65 536 * размер сетевого пакета. Размер сетевого пакета по умолчанию 4 КБ, но его можно изменить. Ознакомьтесь со статьей Максимальная емкость e для SQL 2008, чтобы получить объем. SQL 2005 также имеет такое же ограничение.

0
ответ дан 4 December 2019 в 12:20
поделиться

Массовое копирование обычно выполняется быстрее, чем самостоятельная вставка.

Если вы все же хотите сделать это одним из предложенных вами способов, вы должны сделать это так, чтобы вы могли легко изменить размер запросов, отправляемых на сервер. Таким образом, вы сможете оптимизировать скорость в производственной среде позже. Время запроса может варьироваться в зависимости от размера запроса.

0
ответ дан 4 December 2019 в 12:20
поделиться

В MS SQL Server 2008 вы можете создать .Net table-UDT, который будет содержать вашу таблицу

CREATE TYPE MyUdt AS TABLE (Id int, Name nvarchar(50), salary int)

, затем вы можете использовать этот UDT в своих хранимых процедурах и свой с # -код для пакетной обработки -вставки. SP:

CREATE PROCEDURE uspInsert
 (@MyTvp AS MyTable READONLY)
AS
     INSERT INTO [MyTable]
      SELECT * FROM @MyTvp

C # (представьте, что записи, которые вам нужно вставить, уже содержатся в таблице "MyTable" DataSet ds):

using(conn)
{
    SqlCommand cmd = new SqlCommand("uspInsert", conn);
    cmd.CommandType = CommandType.StoredProcedure;

    SqlParameter myParam = cmd.Parameters.AddWithValue
     ("@MyTvp", ds.Tables["MyTable"]);

    myParam.SqlDbType = SqlDbType.Structured;
    myParam.TypeName = "dbo.MyUdt";

    // Execute the stored procedure
    cmd.ExecuteNonQuery();
}

Итак, это решение.

Наконец, я хочу запретить вам использовать код, подобный вашему (построение строк и затем выполнение этой строки), потому что этот способ выполнения может использоваться для SQL-инъекций.

3
ответ дан 4 December 2019 в 12:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: