Saklanan bir prosedürü çağırmak (OLE DB)

Şunlar için geçerlidir:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalitik Platform Sistemi (PDW)Microsoft Fabric'te SQL veritabanı

OLE DB sürücüsünü indirme

Bir depolanmış prosedür sıfır veya daha fazla parametreye sahip olabilir. Ayrıca bir değer de döndürebilir. SQL Server için OLE DB Sürücüsü kullanılırken, bir saklanan prosedüre parametreler şu adreslerden 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.

Uyarı

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 için OLE DB Sürü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. Bu çağrı, komutanın başarılı bir şekilde hazırlanmasından önce yapılmalıdır. Bu gereklilik, geçici bir işlem için iç adın, istemcinin kullandığı harici adından farklı olmasıdır. MSOLEDBSQL, geçici bir depolanmış prosedür için parametre bilgisini belirlemek amacıyla sistem tablolarını sorgulamıyor.

Aşağıdaki maddeler parametre bağlama sürecindeki adımlardı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 bir prosedürü çağırma yöntemleri

SQL Server'da bir depolanmış prosedür çalıştırılırken, SQL Server için OLE DB Sürücüsü şunları destekler:

  • ODBC CALL kaçış dizisi.
  • Uzaktan prosedür çağrısı (RPC) kaçış dizisi.
  • Transact-SQL EXECUTE ifadesi.

ODBC CALL 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 metadatası) 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 birçok kez çağrıldığında, RPC kaçış dizisi, saklanan bir prosedürü çağırmanın üç yolu arasında en iyi performanslı olanıdır.

RPC kaçış dizisi bir depolanmış 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 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, saklanan prosedürde SQL Server imlecini 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 meta verisini sorgulamıyorsun; 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 SQL, depolanmış bir 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 ifadesi

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 için OLE DB Sürücüsü, komut işlemeyi optimize etmek için SQL Server'ın RPC mekanizmasını kullanır. RPC protokolü, sunucuda yapılan parametre işleme ve ifade ayrıştırmalarının çoğunu ortadan kaldırarak performansı artırır.

Aşağıdaki SQL, Transact-SQL EXECUTE ifadesine örnektir:

EXECUTE SalesByCategory 'Produce', '1995'

Ayrıca bakınız

Saklı yordamlar