Microsoft SQL Сервер: вставка списка проблем; смешивает список - PullRequest
1 голос
/ 24 марта 2020

Ситуация: у меня есть этот метод для вставки списка в одну из моих SQL серверных таблиц:

public void InsertDataAtOnce(List<string> values, List<string> millisecs, string table, string[] parameters)
{
        connection = new SqlConnection(connectionString);
        query = $"INSERT INTO {table} ({parameters[0]}, {parameters[1]}) VALUES (@{parameters[0]}, @{parameters[1]})";

        try
        {
            connection.Open();

            command = new SqlCommand(query, connection);
            command.Parameters.Add($"@{parameters[0]}", SqlDbType.NVarChar);
            command.Parameters.Add($"@{parameters[1]}", SqlDbType.NVarChar);

            for (int i = 0; i <millisecs.Count-2; i++)
            {
                //command.Parameters.Clear();
                command.Parameters[$"@{parameters[0]}"].Value = millisecs[i];
                command.Parameters[$"@{parameters[1]}"].Value = values[i];

                command.ExecuteNonQuery();
            }

            command.Dispose();
            connection.Close();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Connection Error");
            Console.WriteLine(ex);
        }
}

Представьте, что информация о моей вставленной таблице должна быть такой (моя таблица должна содержать около 1700 значений) и я передаю эту информацию методу:

 1. 0.5 15
 2. 0.6 24
 3. 0.7 29
 4. 0.8 32
 5. 0.9 45

Однако, когда я открываю SQL Server Management Studio и проверяю вставленные данные, он смешивает порядок значений, поэтому с этими данными получается результат будет:

 1. 0.5 15
 2. 0.6 24
 3. 0.9 45
 4. 0.8 32
 5. 0.7 29

и так далее. Когда у меня есть мои данные, он смешивает данные в виде кусков, поэтому первые несколько сотен значений будут в порядке, затем он переходит к значениям, которые должны быть в конце или в середине, возвращается на некоторое время к первым значениям. и так далее.

Так в чем здесь проблема? Я проверил списки, которые я передаю, и они, кажется, для того, чтобы я добавил данные, как они должны быть.

Ответы [ 2 ]

3 голосов
/ 24 марта 2020

A SQL Таблица представляет неупорядоченные множества. Там нет заказа. Однако для сохранения порядка вставки можно использовать столбец identity():

create table t (
    t_id int identity(1, 1) primary key,
    . . .
);

При вставке в таблицу не включайте t_id в список столбцов. Он будет установлен автоматически.

Затем вы можете получить результаты «по порядку», выполнив:

select t.*
from t
order by t_id;
1 голос
/ 24 марта 2020

Физический порядок вставки значений в таблицу базы данных определяется на основе индекса, который называется Кластерный индекс .

Если для вас важно вставить значения в заданный В порядке c вы можете создать кластеризованный индекс в указанном поле c (например, целочисленное поле, которое также может быть или не быть вашим первичным ключом), а затем предоставить значение кластеризованного индекса в операторах вставки перед вставкой их в таблица.

Предположим, что вы добавили целочисленное поле с именем Id и создали кластерный индекс для этого поля. Если вы вставляете текущие значения в виде:

    Id   p1 p2
 1.  1  0.5 15
 2.  2  0.6 24
 3.  3  0.7 29
 4.  4  0.8 32
 5.  5  0.9 45

Тогда, если вы запросите таблицу с предложением order by в поле Id, результаты, которые вы получите, будут в точности такими, как вы их вставили:

    Id   p1 p2
 1.  1  0.5 15
 2.  2  0.6 24
 3.  3  0.7 29
 4.  4  0.8 32
 5.  5  0.9 45
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...