Stored Prosedürler - SQL Server Yerel İstemciyi Çağırma

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnalytics Platform System (PDW)

Important

SQL Server Native Client (genellikle kısaltılmış SNAC) SQL Server 2022 (16.x) ve SQL Server Management Studio 19'dan (SSMS) kaldırılmıştır. Hem SQL Server Yerel İstemci OLE DB sağlayıcısı (SQLNCLI veya SQLNCLI11) hem de SQL Server için eski Microsoft OLE DB Sağlayıcısı (SQLOLEDB) yeni geliştirme için önerilmez. İleride SQL Server için yeni Microsoft OLE DB Sürücüsüne (MSOLEDBSQL) geçin.

Bir depolanmış prosedür sıfır veya daha fazla parametreye sahip olabilir. Ayrıca bir değer de döndürebilir. SQL Server Native Client OLE DB sağlayıcısı kullanılırken, bir saklanan prosedüre parametreler şu kişilerden iletilebilir:

  • Veri değerini sıkı kodlama.

  • Parametre belirtisi (?) kullanarak parametreleri belirtirken, bir program değişkenini parametre işaretçisine bağlayın ve ardından veri değerini program değişkenine yerleştirin.

Note

SQL Server depolanmış prosedürleri OLE DB ile adlandırılmış parametrelerle çağrılarken, parametre isimleri '@' karakteriyle başlamalıdır. Bu, SQL Server'a özgü bir kısıtlamadır. SQL Server Native Client OLE DB sağlayıcısı bu kısıtlamayı MDAC'a göre daha sıkı uygular.

Parametreleri desteklemek için ICommandWithParameters arayüzü komut nesnesinde görünür. Parametreleri kullanmak için tüketici önce ICommandWithParameters::SetParameterInfo metodunu çağırarak (veya isteğe bağlı olarak GetParameterInfo metodunu çağıran bir çağrı ifadesi hazırlayarak) parametreleri sağlayıcıya açıklar. Tüketici daha sonra bir tampon yapısını belirleyen ve bu tampona parametre değerlerini yerleştiren bir accessör oluşturur. Son olarak, erişimciyi ve bir işaretçiyi tampona Execute için gönderir. Daha sonraki Execute çağrılarında, tüketici tampona yeni parametre değerleri yerleştirir ve Execute'u accessor handle ve buffer pointer ile çağırır.

Parametreler kullanılarak geçici bir depolanmış prosedürü çağıran bir komut, parametre bilgisini tanımlamak için önce ICommandWithParameters::SetParameterInfo komutunu çağırmalıdır, komut başarılı bir şekilde hazırlanmadan önce. Bunun nedeni, geçici bir depolanmış prosedürün iç adının, istemci tarafından kullanılan harici adından farklı olmasıdır ve SQLOLEDB, geçici bir işlem için parametre bilgisini belirlemek için sistem tablolarını sorgulayamaz.

Parametre bağlama sürecindeki adımlar şunlardır:

  1. Parametre bilgilerini DBPARAMBINDINFO yapılarından oluşan bir dizide doldurun; yani, parametre adı, parametrenin veri tipi için sağlayıcıya özgü bir ad veya standart bir veri tipi adı vb. Dizideki her yapı bir parametreyi tanımlar. Bu dizi daha sonra SetParameterInfo yöntemine iletilir.

  2. Parametreleri sağlayıcıya tanımlamak için ICommandWithParameters::SetParameterInfo metodunu çağırın. SetParameterInfo , her parametrin yerel veri tipini belirtir. SetParameterInfo argümanları şunlardır:

    • Tip bilgisini ayarlamak için parametre sayısı.

    • Tip bilgisi ayarlanacak parametre ordinalleri dizisi.

    • DBPARAMBINDINFO yapılarından oluşan bir dizide.

  3. IAccessor::CreateAccessor komutunu kullanarak bir parametre erişimcüsü oluşturun. Erişici, bir tamponun yapısını belirler ve parametre değerlerini tampona yerleştirir. CreateAccessor komutu, bir dizi bağlamadan bir accessör oluşturur. Bu bağlamalar, tüketici tarafından DBBINASYON yapılarının bir dizisi kullanılarak tanımlanır. Her bağlama, tüketicinin tamponuna tek bir parametre bağlar ve aşağıdaki gibi bilgileri içerir:

    • Bağlamanın uygulandığı parametrenin ordinali.

    • Bağlı olan nedir (veri değeri, uzunluğu ve durumu).

    • Bu parçaların her birine tampon içindeki ofset.

    • Tüketicinin tamponunda var olan veri değerinin uzunluğu ve türü.

    Bir accessör, HACCESSOR tipindeki tutacağı ile tanımlanır. Bu kullanıcı CreateAccessor yöntemiyle döndürülür. Tüketici bir accessörü kullanmayı bitirdiğinde, tuttuğu belleği serbest bırakmak için ReleaseAccessor yöntemini çağırmalıdır.

    Tüketici ICommand::Execute gibi bir metodu çağırdığında, tutamacı bir erişime, bir işaretçiyi ise bir tampona iletir. Sağlayıcı, bu erişimciyi kullanarak tampondaki verilerin nasıl aktarılacağını belirler.

  4. DBPARAMS yapısını doldurun. Giriş parametre değerlerinin alındığı ve çıktı parametre değerlerinin yazıldığı tüketici değişkenleri, çalışma zamanında DBPARAMS yapısında ICommand::Execute'a iletilir. DBPARAMS yapısı üç unsurdan oluşur:

    • Sağlayıcının giriş parametre verilerini aldığı ve sağlayıcının erişim parametre verisini geri döndürdüğü tampon işareti, erişim tutamacı tarafından belirtilen bağlamalara göre geçerlidir.

    • Tampondaki parametre kümelerinin sayısı.

    • Adım 3'te oluşturulan accessor kolu.

  5. ICommand::Execute ile komutu çalıştırın.

Saklanan Prosedürü Çağırma Yöntemleri

SQL Server'da bir depolanmış prosedür çalıştırılırken, SQL Server Native Client OLE DB sağlayıcısı şunları destekler:

  • ODBC CALL kaçış dizisi.

  • Uzaktan prosedür çağrısı (RPC) kaçış dizisi.

  • Transact-SQL EXECUTE ifadesi.

ODBC ÇAĞIRMA Kaçış Dizisi

Parametre bilgisini biliyorsanız, parametreleri sağlayıcıya açıklamak için ICommandWithParameters::SetParameterInfo metodunu çağırın. Aksi takdirde, ODBC CALL sözdizimi saklanan bir prosedürü çağırırken kullanıldığında, sağlayıcı depolanan prosedür parametre bilgisini bulmak için yardımcı bir fonksiyon çağırır.

Parametre bilgisinden (parametre metadata) emin değilseniz, ODBC CALL sözdizimi önerilir.

ODBC CALL kaçış dizisi kullanılarak bir prosedürü çağırmanın genel sözdizimi şudur:

{[?=]procedure_name[([parametre][,[parametre]]... )]}

Örneğin:

{call SalesByCategory('Produce', '1995')}  

RPC Kaçış Dizisi

RPC kaçış dizisi, saklanan bir prosedürü çağırmanın ODBC CALL sözdizisine benzer. Prosedürü birden fazla kez çağırırsanız, RPC kaçış dizisi depolanmış bir prosedürü çağırmanın üç yöntemi arasında en optimal performansı sağlar.

RPC kaçış dizisi bir saklanan prosedürü çalıştırmak için kullanıldığında, sağlayıcı parametre bilgisini belirlemek için herhangi bir yardımcı fonksiyon çağırmaz (ODBC CALL sözdizimi durumunda olduğu gibi). RPC sözdizimi ODBC CALL sözdiziminden daha basittir, bu yüzden komut daha hızlı ayrıştırılır ve performansı artırır. Bu durumda, ICommandWithParameters::SetParameterInfo çalıştırarak parametre bilgisini sağlamanız gerekir.

RPC kaçış dizisi için bir geri dönüş değeri gerek. Eğer saklanan prosedür bir değer döndürmezse, sunucu varsayılan olarak 0 döner. Ayrıca, depolanmış prosedürde SQL Server imleci açamazsınız. Saklanan prosedür örtük olarak hazırlanır ve ICommandPrepare::P repare çağrısı başarısız olur. RPC çağrısı hazırlanamadığı için sütun metaverisi sorgulamıyor; IColumnsInfo::GetColumnInfo ve IColumnsRowset::GetColumnsRowset DB_E_NOTPREPARED döndürecektir.

Tüm parametre meta verilerini biliyorsanız, RPC kaçış dizisi depolanmış prosedürleri çalıştırmak için önerilen yoldur.

Bu, bir depolanmış prosedürü çağırmak için RPC kaçış dizisine bir örnektir:

{rpc SalesByCategory}  

RPC kaçış dizisini gösteren örnek uygulama için, Stored Procedure Execute (Using RPC Syntax) ve Process Return Codes and Output Parameters (OLE DB) bölümlerine bakınız.

Transact-SQL EXECUTE Bildirimi

ODBC CALL kaçış dizisi ve RPC kaçış dizisi, saklanan bir prosedürü çağırmak için tercih edilen yöntemlerdir, EXECUTE ifadesi yerine. SQL Server Native Client OLE DB sağlayıcısı, komut işlemeyi optimize etmek için SQL Server'ın RPC mekanizmasını kullanır. Bu RPC protokolü, sunucuda yapılan parametre işleme ve ifade ayrıştırmalarının çoğunu ortadan kaldırarak performansı artırır.

Bu, Transact-SQL EXECUTE ifadesine bir örnektir:

EXECUTE SalesByCategory 'Produce', '1995'