Aracılığıyla paylaş


Tabloya değer atanmış parametreler

ADO.NET indirin

Tablo değerli parametreler, bir istemci uygulamasından SQL Server'a birden çok veri satırını aktarmanın kolay bir yolunu sağlar. Verileri işlemek için birden çok gidiş dönüş veya özel sunucu tarafı mantığı gerekmez. Tablo değerli parametreleri kullanarak bir istemci uygulamasındaki veri satırlarını kapsülleyebilir ve verileri tek bir parametreli komutla sunucuya gönderebilirsiniz. Gelen veri satırları, transact-SQL kullanılarak üzerinde çalıştırılabilir bir tablo değişkeninde depolanır.

Tablo değerli parametrelerdeki sütun değerlerine standart Transact-SQL SELECT deyimleri kullanılarak erişilebilir. Tablo değerli parametreler kesin olarak yazılır ve yapıları otomatik olarak doğrulanır. Tablo değerli parametrelerin boyutu yalnızca sunucu belleğiyle sınırlıdır.

Uyarı

Tablo değerli bir parametrede veri döndüremezsiniz. Tablo değerli parametreler yalnızca giriştir; OUTPUT anahtar kelimesi desteklenmiyor.

Tablo değerli parametreler hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın.

Resource Description
Table-Valued Parametreleri (Veritabanı Altyapısı) Kullanma Tablo değerli parametrelerin nasıl oluşturulacağını ve kullanılacağını açıklar.
Kullanıcı tanımlı tablo türü oluşturma Tablo değerli parametreleri bildirmek için kullanılan kullanıcı tanımlı tablo türlerini açıklar.
User-Defined Tablo Türleri Tablo değerli parametreleri bildirmek için kullanılan kullanıcı tanımlı tablo türlerini açıklar.

SQL Server'ın önceki sürümlerinde birden çok satırın aktarımı

Tablo değerli parametreler kullanılmadan önce, birden çok veri satırını saklı yordama veya parametreli SQL komutuna geçirme seçenekleri sınırlıydı. Bir geliştirici, sunucuya birden çok satır geçirmek için aşağıdaki seçenekler arasından seçim yapabilir:

  • Birden çok sütundaki ve veri satırındaki değerleri göstermek için bir dizi bağımsız parametre kullanın. Bu yöntem kullanılarak geçirilebilen veri miktarı, izin verilen parametre sayısıyla sınırlıdır. SQL Server yordamlarında en fazla 2100 parametre olabilir. Bu tek tek değerleri işlemek üzere bir tablo değişkenine veya geçici bir tabloya birleştirmek için sunucu tarafı mantığı gereklidir.

  • Birden çok veri değerini sınırlandırılmış dizelerde veya XML belgelerinde paketleyin ve sonra bu metin değerlerini bir yordama veya deyime geçirin. Bu yöntem, yordam veya deyimin veri yapılarını doğrulama ve değerleri ayırma mantığını içermesini gerektirir.

  • Bir Update metodunu çağırarak ve SqlDataAdapter oluşturulanlar gibi birden fazla satırı etkileyen veri değişiklikleri için bir dizi bireysel SQL deyimi oluşturun. Değişiklikler sunucuya tek tek gönderilebilir veya gruplar halinde toplu olarak oluşturulabilir. Ancak, birden çok deyim içeren toplu olarak gönderildiğinde bile, her deyim sunucuda ayrı olarak yürütülür.

  • Bir tabloya bcp çok sayıda veri satırı yüklemek için yardımcı programı veya SqlBulkCopy nesnesini kullanın. Bu teknik verimli olsa da, veriler geçici bir tablo veya tablo değişkenine yüklenmediği sürece sunucu tarafı işlemeyi desteklemez.

Tablo türündeki parametreleri oluşturma

Tablo değerli parametreler, Transact-SQL CREATE TYPE ifadeleri kullanılarak tanımlanan kesin olarak belirlenmiş tablo yapılarını temel alır. İstemci uygulamalarınızda tablo değerli parametreleri kullanabilmeniz için önce bir tablo türü oluşturmanız ve SQL Server'da yapıyı tanımlamanız gerekir. Tablo türleri oluşturma hakkında daha fazla bilgi için Tablo-Değerli Parametreleri Kullanma (Veritabanı Motoru) bölümüne bakın.

Aşağıdaki deyim CategoryID ve CategoryName sütunlarından oluşan CategoryTableType adlı bir tablo türü oluşturur:

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

Bir tablo türü oluşturduktan sonra, tablo değerli parametreleri bu türe göre bildirebilirsiniz. Aşağıdaki Transact-SQL parçası, saklı yordam tanımında tablo değerli bir parametrenin nasıl ilan edileceğini göstermektedir. Tablo değerli bir parametreyi tanımlamak için READONLY anahtar sözcüğü gereklidir.

CREATE PROCEDURE usp_UpdateCategories
    (@tvpNewCategories dbo.CategoryTableType READONLY)

Tablo değerli parametrelerle verileri değiştirme (Transact-SQL)

Tablo değerli parametreler, tek bir deyim yürütülerek birden çok satırı etkileyen küme tabanlı veri değişikliklerinde kullanılabilir. Örneğin, tablo değerli bir parametredeki tüm satırları seçip bir veritabanı tablosuna ekleyebilir veya güncelleştirmek istediğiniz tabloya tablo değerli bir parametre ekleyerek bir update deyimi oluşturabilirsiniz.

Aşağıdaki Transact-SQL UPDATE deyimi, tablo değerli bir parametreyi Kategoriler tablosuna birleştirerek nasıl kullanılacağını gösterir. FROM yan tümcesinde JOIN ile tablo değerli bir parametre kullandığınızda, burada belirtildiği gibi, tablo değerli parametreyi "ec" olarak adlandırmanız gerekir.

UPDATE dbo.Categories
    SET Categories.CategoryName = ec.CategoryName
    FROM dbo.Categories INNER JOIN @tvpEditedCategories AS ec
    ON dbo.Categories.CategoryID = ec.CategoryID;

Bu Transact-SQL örneği, tek bir set tabanlı işlemde INSERT gerçekleştirmek için tablo değerli bir parametreden nasıl satır seçileceğini gösterir.

INSERT INTO dbo.Categories (CategoryID, CategoryName)
    SELECT nc.CategoryID, nc.CategoryName FROM @tvpNewCategories AS nc;

Tablo değerli parametrelerin sınırlamaları

Tablo değerli parametrelerle ilgili çeşitli sınırlamalar vardır:

  • Tablo değerli parametreleri CLR kullanıcı tanımlı işlevlere geçiremezsiniz.

  • Tablo değerli parametreler yalnızca UNIQUE veya PRIMARY KEY kısıtlamalarını desteklemek için dizinlenebilir. SQL Server, tablo değerli parametrelerle ilgili istatistikleri korumaz.

  • Tablo değerli parametreler Transact-SQL kodunda salt okunurdur. Tablo değerli bir parametrenin satırlarındaki sütun değerlerini güncelleştiremez ve satır ekleyemez veya silemezsiniz. Tablo değerli bir parametrede saklı yordama veya parametreli deyime geçirilen verileri değiştirmek için, verileri geçici bir tabloya veya tablo değişkenine eklemeniz gerekir.

  • Tablo değerli parametrelerin tasarımını değiştirmek için ALTER TABLE deyimlerini kullanamazsınız.

SqlParameter örneği yapılandırma

Microsoft.Data.SqlClient destekler, DataTable, DbDataReader, veya IEnumerable<T> \ SqlDataRecord nesnelerinden tablo değerli parametreleri doldurmayı. TypeName özelliğini kullanarak tablo değerli parametresi için bir SqlParameter tür adı belirtin. , TypeName daha önce sunucuda oluşturulan uyumlu bir türün adıyla eşleşmelidir. Aşağıdaki kod parçası, SqlParameter veri eklemek için nasıl yapılandırılacağını gösterir.

Aşağıdaki örnekte addedCategories değişkeni bir DataTableiçerir. Değişkenin nasıl doldurulduğunu görmek için sonraki bölümdeki örneklere bakın: Saklı Yordamına Tablo-Değerli Parametre Geçirme.

// Configure the command and parameter.
SqlCommand insertCommand = new SqlCommand(sqlInsert, connection);
SqlParameter tvpParam = insertCommand.Parameters.AddWithValue("@tvpNewCategories", addedCategories);
tvpParam.SqlDbType = SqlDbType.Structured;
tvpParam.TypeName = "dbo.CategoryTableType";

Veri satırlarını bir tablo değerli parametreye aktarmak için DbDataReader nesnesinden türetilen herhangi bir nesneyi de kullanabilirsiniz, bu parçada gösterildiği gibi:

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

Bir tablo değerli parametreyi saklı yordamına geçirme

Bu örnekte tablo değerli parametre verilerinin saklı yordama nasıl geçirileceği gösterilmektedir. Kod, GetChanges yöntemini kullanarak eklenen satırları yeni bir DataTable içine ayıklar. Kod, ardından CommandType özelliğini StoredProcedure olarak ayarlayarak bir SqlCommand tanımlar. AddWithValue yöntemi kullanılarak SqlParameter doldurulur ve SqlDbTypeStructured olarak ayarlanır. SqlCommand, ExecuteNonQuery yöntemi kullanılarak yürütülür.

// 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();
}

Tablo değerli bir parametreyi parametreli SQL deyimine geçirme

Aşağıdaki örnek, tablo değerli bir parametreyi veri kaynağı olarak kullanan bir SELECT alt sorgusuyla dbo.Categories tablosuna INSERT deyimi kullanarak veri eklemeyi göstermektedir. Tablo değerli bir parametreyi parametreli bir SQL deyimine geçirirken, TypeName özelliğini kullanarak tablo değerli parametre için bir tür adı SqlParameter belirtmeniz gerekir. Bu TypeName , daha önce sunucuda oluşturulan uyumlu bir türün adıyla eşleşmelidir. Bu örnekteki kod, dbo.CategoryTableType içinde tanımlanan tür yapısına başvurmak için TypeName özelliğini kullanır.

Uyarı

Tablo değerli bir parametredeki bir kimlik sütunu için değer sağlarsanız, oturum için SET IDENTITY_INSERT ifadesini çalıştırmanız gerekir.

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

    // Define the INSERT-SELECT statement.
    string sqlInsert =
        "INSERT INTO dbo.Categories (CategoryID, CategoryName)"
        + " SELECT nc.CategoryID, nc.CategoryName"
        + " FROM @tvpNewCategories AS nc;"

    // Configure the command and parameter.
    SqlCommand insertCommand = new SqlCommand(sqlInsert, connection);
    SqlParameter tvpParam = insertCommand.Parameters.AddWithValue("@tvpNewCategories", addedCategories);
    tvpParam.SqlDbType = SqlDbType.Structured;
    tvpParam.TypeName = "dbo.CategoryTableType";

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

DataReader ile satır akışı yapmak

Tablo değerli bir parametreye veri satırlarını akıtmak için de DbDataReader öğesinden türetilen herhangi bir nesneyi kullanabilirsiniz. Aşağıda verilen kod parçası, bir OracleCommand ve bir OracleDataReader kullanarak Oracle veritabanından veri almayı gösterir. Kod daha sonra bir SqlCommand saklı yordamı tek bir giriş parametresiyle çağırmak için yapılandırılır. SqlDbType özelliği SqlParameter olarak Structuredayarlanır. AddWithValue sonuç kümesini saklı yordamda tablo değerli bir parametre olarak OracleDataReader 'e geçirir.

// Assumes connection is an open SqlConnection.
// Retrieve data from Oracle.
OracleCommand selectCommand = new OracleCommand(
    "Select CategoryID, CategoryName FROM Categories;",
    oracleConnection);
OracleDataReader oracleReader = selectCommand.ExecuteReader(
    CommandBehavior.CloseConnection);

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

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

Sonraki Adımlar