如何在SQL Server中按存储过程插入数据表

时间:2019-06-02 11:56:54

标签: sql-server

我试图通过使用存储过程将数据表中的许多记录插入SQL Server表中。我需要一起插入数据表的记录。

我正在使用C#编程语言,并且希望通过ADO.net存储过程将许多记录一起发送到SQL Server。我想了解数据表类型,并在有帮助的情况下使用它。

1 个答案:

答案 0 :(得分:1)

要有效地将许多行传递给存储过程,请使用table-valued parameter。 C#应用程序可以指定结构化的参数类型和数据表的值。为了获得最佳性能,请确保DataTable列类型与服务器端表类型列类型(包括字符串列的最大长度)匹配。

以下是上面文档链接的示例摘录:

// Assumes connection is an open SqlConnection object.  
using (connection)  
{  
  // Create a DataTable with the modified rows.  
  DataTable addedCategories = CategoriesDataTable.GetChanges(DataRowState.Added);  

  // Configure the SqlCommand and SqlParameter.  
  SqlCommand insertCommand = new SqlCommand("usp_InsertCategories", connection);  
  insertCommand.CommandType = CommandType.StoredProcedure;  
  SqlParameter tvpParam = insertCommand.Parameters.AddWithValue("@tvpNewCategories", addedCategories);  
  tvpParam.SqlDbType = SqlDbType.Structured;  

  // Execute the command.  
  insertCommand.ExecuteNonQuery();  
}

以下是用于创建表类型和proc的T-SQL代码段。

CREATE TYPE dbo.CategoryTableType AS TABLE  
    ( CategoryID int, CategoryName nvarchar(50) );
GO

CREATE PROC dbo.usp_InsertCategories
AS
@tvpNewCategories dbo.CategoryTableType READONLY
INSERT INTO dbo.Categories (CategoryID, CategoryName)  
    SELECT nc.CategoryID, nc.CategoryName FROM @tvpNewCategories AS nc;
GO

即使对于琐碎的插入操作,TVP性能也可以利用存储过程接口的优势提供performance similar to SqlBulkCopy(每秒几千个)。