Чтобы эффективно передать много строк хранимой процедуре, используйте табличный параметр . Приложение 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();
}
Вот фрагменты 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 может обеспечить производительность, аналогичную SqlBulkCopy (много тысяч в секунду) с преимуществом интерфейса хранимых процедур.