将List <int>插入到没有存储过程的Temp表中

时间:2018-07-04 12:51:40

标签: c# sql-server linq collections linq-to-sql

我有一个整数List<int> lstIds的列表。现在,我想将所有这些ID添加到临时表中。

我知道一些不同的方法,例如使用SqlCommand参数,这将需要进行多个数据库调用,这是不可取的。另外,我也不想使用存储过程。

那么,是否可以将整个List插入到临时表中?如果是,那怎么办?

注意:使用LINQ的解决方案也可以。

编辑:有人将其标记为this问题的重复项,而在给定的问题中,他们将DataTable作为临时表,而在这里我要将数据存储在SQL Server临时表中。

3 个答案:

答案 0 :(得分:1)

当您想使用ADO.NET将某种数组数据传递到SQL Server 2008或更高版本时,可以定义并使用表值参数:

"/onboarding"

然后您可以在C#代码中执行以下操作:

CREATE TYPE integer_list_tbltype AS TABLE (n int NULL)

有关更多信息,请参阅Erland Sommarskog的文章:http://www.sommarskog.se/arrays-in-sql-2008.html

答案 1 :(得分:1)

您没有提到正在使用哪个版本的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};

使用(变量连接=新的SqlConnection(“数据源=本地主机;初始目录=正在测试;集成安全性=真实;”)) {     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());
}

}

答案 2 :(得分:-1)

您必须使用linq

通过创建数据上下文

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

您的DbContext类在temp所在的位置