Sql server 2008 大容量插入SQL Server 2008

Sql server 2008 大容量插入SQL Server 2008,sql-server-2008,bulkinsert,Sql Server 2008,Bulkinsert,请看T-SQL命令。但是,由于我个人对该命令没有太多经验,我确实看到了一些立即的机会,可以通过在循环外部创建命令和参数,并仅在循环内部进行必要的更改,使用相同的sql来改进此代码: string upSql=“UPDATE CumulativeTable SET EngPosFT=@EngPosFT,EngFTAv=@EngFTAv其中RegNumber=@RegNumber AND Session=@Session AND Form=@Form AND Class=@Class”; SqlCo

请看T-SQL命令。但是,由于我个人对该命令没有太多经验,我确实看到了一些立即的机会,可以通过在循环外部创建命令和参数,并仅在循环内部进行必要的更改,使用相同的sql来改进此代码:

string upSql=“UPDATE CumulativeTable SET EngPosFT=@EngPosFT,EngFTAv=@EngFTAv其中RegNumber=@RegNumber AND Session=@Session AND Form=@Form AND Class=@Class”;
SqlCommand cmdB=新的SqlCommand(upSql,连接);
cmdB.CommandTimeout=980000;
//我不得不猜测您在这里使用的sql类型。
//调整此值以匹配实际的列数据类型
添加(“@EngPosFT”,SqlDbType.Int);
添加(“@RegNumber”,SqlDbType.Int);
//在这里使用显式类型也确实更好。
//我将仅更新第一个参数作为其外观的示例:
Add(“@EngFTAv”,SqlDbType.Decimal).Value=Math.Round((engtot/arrayCount),2));
cmdB.Parameters.AddWithValue(“@Session”,drpSess.SelectedValue);
cmdB.Parameters.AddWithValue(“@Form”,drpForm.SelectedValue);
cmdB.Parameters.AddWithValue(“@Class”,SqlDbTypedrpClass.SelectedValue);
for(int i=0;i
在这种情况下,最好编写一个存储过程并在for循环中调用该存储过程,在每次调用时传递必要的参数

在这种情况下,最好创建一个接受。在.NET方面,您创建了一个
DataTable
对象,其中包含一行用于您要使用的每一组值

在SQL Server方面,可以将参数视为查询中的另一个表。因此,在存储过程中,您将有:

            SqlCommand cmdB = null;
            for (int i = 0; i < myClass.Length; i++)
            {
                command.Append("UPDATE CumulativeTable SET" + " EngPosFT = " + Convert.ToInt32(Pos.GetValue(i)) + "," + " EngFTAv = " + Math.Round((engtot / arrayCount), 2) +
        " WHERE RegNumber = " + myClass.GetValue(i) + " AND Session= " + drpSess.SelectedValue + " AND Form= " + drpForm.SelectedValue + " AND Class= " + drpClass.SelectedValue + ";");

               //or command.AppendFormat("UPDATE CumulativeTable SET EngPosFT = {0},EngFTAv={1} WHERE RegNumber ={2} AND Session={3} AND Form={4} AND Class={5};", Convert.ToInt32(Pos.GetValue(i)), Math.Round((engtot / arrayCount), 2), myClass.GetValue(i), drpSess.SelectedValue, drpForm.SelectedValue, drpClass.SelectedValue);



            }//max length is 128 error is encountered
其中
@MyParm
是表值参数


这将作为到服务器的一次往返处理。

谢谢Joel。减少了执行时间,但仍会对服务器进行相同次数的访问。我只是希望有人可以编写批量插入代码,因为我已经花了几个小时试图将其正确。
UPDATE a
SET
    EngPosFT = b.EngPosFT,
    EngFTAv=b.EngFTAv
FROM
    CumulativeTable a
       inner join
    @MyParm b
       on
           a.RegNumber =b.RegNumber AND
           a.Session=b.Session AND
           a.Form=b.Form AND
           a.Class=b.Class
UPDATE a
SET
    EngPosFT = b.EngPosFT,
    EngFTAv=b.EngFTAv
FROM
    CumulativeTable a
       inner join
    @MyParm b
       on
           a.RegNumber =b.RegNumber AND
           a.Session=b.Session AND
           a.Form=b.Form AND
           a.Class=b.Class
using System;
using System.Data;
using System.Data.SqlClient;

    namespace DataTableExample
    {
        class Program
        {
          static void Main(string[] args)
            {
                DataTable prodSalesData = new DataTable("ProductSalesData");

                // Create Column 1: SaleDate
                DataColumn dateColumn = new DataColumn();
                dateColumn.DataType = Type.GetType("System.DateTime");
                dateColumn.ColumnName = "SaleDate";

                // Create Column 2: ProductName
                DataColumn productNameColumn = new DataColumn();
                productNameColumn.ColumnName = "ProductName";

                // Create Column 3: TotalSales
                DataColumn totalSalesColumn = new DataColumn();
                totalSalesColumn.DataType = Type.GetType("System.Int32");
                totalSalesColumn.ColumnName = "TotalSales";

                // Add the columns to the ProductSalesData DataTable
                prodSalesData.Columns.Add(dateColumn);
                prodSalesData.Columns.Add(productNameColumn);
                prodSalesData.Columns.Add(totalSalesColumn);

                // Let's populate the datatable with our stats.
                // You can add as many rows as you want here!

                // Create a new row
                DataRow dailyProductSalesRow = prodSalesData.NewRow();
                dailyProductSalesRow["SaleDate"] = DateTime.Now.Date;
                dailyProductSalesRow["ProductName"] = "Nike";
                dailyProductSalesRow["TotalSales"] = 10;

                // Add the row to the ProductSalesData DataTable
                prodSalesData.Rows.Add(dailyProductSalesRow);

                // Copy the DataTable to SQL Server using SqlBulkCopy
                using (SqlConnection dbConnection = new SqlConnection("Data Source=ProductHost;Initial Catalog=dbProduct;Integrated Security=SSPI;Connection Timeout=60;Min Pool Size=2;Max Pool Size=20;"))
                {
                    dbConnection.Open();
                    using (SqlBulkCopy s = new SqlBulkCopy(dbConnection))
                    {
                        s.DestinationTableName = prodSalesData.TableName;

                        foreach (var column in prodSalesData.Columns)
                            s.ColumnMappings.Add(column.ToString(), column.ToString());

                        s.WriteToServer(prodSalesData);
                    }
                }
            }
        }
    }