Вставить список <int>в таблицу Temp без хранимой процедуры - PullRequest
0 голосов
/ 04 июля 2018

У меня есть список целых чисел List<int> lstIds. Теперь я хочу добавить все эти ID во временную таблицу.

Я знаю несколько разных подходов, таких как использование SqlCommand параметров, которые потребуют сделать несколько вызовов базы данных, что не является предпочтительным. Кроме того, я не хочу использовать хранимую процедуру.

Итак, можно ли вставить все List в временную таблицу? Если да, то как?

Примечание: решение с LINQ также будет работать.

РЕДАКТИРОВАТЬ: кто-то отметил это как дубликат этого вопроса, в то время как в данном вопросе они взяли DataTable в качестве временной таблицы, в то время как здесь я хочу сохранить данные во временной таблице SQL Server.

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Если вы хотите передать какие-либо данные массива в SQL Server 2008 или более позднюю версию с помощью ADO.NET, вы можете определить и использовать табличный параметр:

CREATE TYPE integer_list_tbltype AS TABLE (n int NULL)

Затем вы можете сделать что-то подобное в своем коде C #:

List<int> integers = new List<int> { 1, 2, 3 };

DataTable dataTable = new DataTable();
dataTable.Columns.Add("n", typeof(int));
dataTable.SetTypeName("integer_list_tbltype");
foreach (int i in integers)
    dataTable.Rows.Add(i);

using (SqlCommand cmd = new SqlCommand())
{
    cmd.Connection = conn;

    cmd.CommandText = "INSERT INTO YourTable (n) SELECT n FROM @integers";
    cmd.Parameters.Add("@integers", SqlDbType.Structured);
    cmd.Parameters["@integers"].Direction = ParameterDirection.Input;
    cmd.Parameters["@integers"].TypeName = "integer_list_tbltype";
    cmd.Parameters["@integers"].Value = dataTable;
    cmd.ExecuteNonQuery();
}

Дополнительную информацию см. В статье Эрланда Соммарскога: http://www.sommarskog.se/arrays-in-sql-2008.html

0 голосов
/ 04 июля 2018

Вы не упомянули, какую версию SQL Server вы используете ... но предполагая, что это текущая версия, вы можете использовать функцию STRING_SPLIT: https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql?view=sql-server-2017

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

Код SQL

DECLARE @Array NVARCHAR(MAX) = '0,1,2,3,4,5,6,7,8,9,10';

DECLARE @TemporaryTable TABLE (
    [Value] INT
);

INSERT INTO @TemporaryTable ( [Value] )
SELECT CONVERT(INT, [value]) FROM STRING_SPLIT(@Array, ',');

SELECT [Value] FROM @TemporaryTable

List<int> lstIds = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

C # код

List<int> lstIds = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

использование (var connection = new SqlConnection ("Источник данных = localhost; Начальный каталог = Тестирование; Интегрированная безопасность = True;")) { connection.Open ();

using (var command = connection.CreateCommand())
{
    command.CommandText = @"CREATE TABLE #TemporaryTable ( [Value] INT );";
    command.CommandType = System.Data.CommandType.Text;
    command.ExecuteNonQuery();
}

using (var command = connection.CreateCommand())
{
    command.CommandText = @"INSERT INTO #TemporaryTable ( [Value] ) SELECT CONVERT(INT, [value]) FROM STRING_SPLIT(@Array, ',');";
    command.CommandType = System.Data.CommandType.Text;
    command.Parameters.Add(new SqlParameter("@Array", string.Join(",", lstIds)));
    command.ExecuteNonQuery();
}

using (var command = connection.CreateCommand())
{
    command.CommandText = @"SELECT COUNT(1) FROM #TemporaryTable";
    command.CommandType = System.Data.CommandType.Text;
    int count = Convert.ToInt32(command.ExecuteScalar());
}

}

0 голосов
/ 04 июля 2018

Вы должны использовать linq.

Создавая datacontext

Using(Datacontext dc = new Datacontext())
{
    foreach(int id in lstIds.Items)
    {
        temp.Add(id);
    }
    dc.SubmitChanges();
}

Где temp будет ваш класс DbContext

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...