Aracılığıyla paylaş


Parametreler ve yürütme, yeniden planla

ADO, OLE DB ve ODBC uygulamalarının, parametre imleyicileri dahil parametrelerinin kullanımı, yeniden yürütme planları, artırabilirsiniz.

Security noteSecurity Note:

Son kullanıcılar tarafından yazılan değerleri ya da veri erişim API yöntem, yürütmek deyim kullanarak sonra yürütülecek olan bir dize halinde değerleri bitiştirme'den daha güvenli tutmak için parametreleri veya parametre imleyicileri kullanan veya Sp_executesql saklı yordamını.

Aşağıdaki iki SELECT ifadelerine arasındaki tek fark, WHERE yan tümcesinde dönemiyle değerleri verilmiştir:

SELECT * FROM AdventureWorks.Production.Product WHERE ProductSubcategoryID = 1;

SELECT * FROM AdventureWorks.Production.Product WHERE ProductSubcategoryID = 4;

Bu sorgu için yürütme planları arasındaki tek fark karşı karşılaştırma için depolanan değer olan Productsubcategoryıd sütun.Amaç için iken SQL Server her zaman ifadeleri temelde aynı planı oluştur ve planlarını, yeniden tanınamıyor. SQL Server Bazen bu karmaşık SQL deyimleri algılamıyor.

Sabitler, parametreleri kullanarak SQL deyim ayırarak, ilişkisel yinelenen planları tanıma altyapısı yardımcı olur.Parametreleri aşağıdaki şekillerde kullanabilirsiniz:

  • Içinde Transact-SQL, kullanma Sp_executesql:

    DECLARE @MyIntParm INT
    SET @MyIntParm = 1
    EXEC sp_executesql
      N'SELECT * FROM AdventureWorks.Production.Product WHERE ProductSubcategoryID = @Parm',
      N'@Parm INT',
      @MyIntParm
    

    Bu yöntem için önerilir Transact-SQL komut dosyaları, saklı yordamlar veya SQL deyimlerini dinamik olarak oluşturan Tetikleyicileri.

  • ADO, OLE DB ve ODBC parametre imleyicileri kullanır.Soru sabit içindeki yerini işaretleri (?) parametre imleyicileri olan bir SQL deyim ve bir programı değişkenine bağlıdır.Örneğin, bir ODBC uygulamasında aşağıdakileri yapmanız:

    • Kullanımı SQLBindParameter bir SQL ilk parametre işaretçisi bir tamsayı değişken bağlanacak deyim.

    • Tamsayı değeri değişken olarak yerleştirin.

    • Deyim, parametre işaretçisi (?) belirten yürütün:

      SQLExecDirect(hstmt, 
        "SELECT * FROM AdventureWorks.Production.Product WHERE ProductSubcategoryID = ?",
        SQL_NTS);
      

      The SQL Server Native istemci OLE DB sağlayıcı and the SQL Server Native istemci ODBC driver included with SQL Server use sp_executesql to send statements to SQL Server when parameter markers are used in applications.

  • Tasarım gereği parametrelerini kullanırlar, saklı yordamlar tasarlamak için .

Açıkça parametreleri uygulamalarınızın tasarımı değil oluşturursanız, siz de kullanan SQL Server otomatik olarak varsayılan davranışı kullanarak bazı sorgular parameterize için sorgu iyileştiricisi Basit Parameterization. Bunun yerine, veritabanındaki tüm sorguları FORCED için ALTER DATABASE deyimini PARAMETERIZATION seçeneği ayarlayarak parameterizing göz önüne almanız gereken sorgu iyileştiricisi zorlayabilir.Daha fazla bilgi için bkz:Zorlanmış Parameterization.

Zorlanmış Parameterization etkinleştirildiğinde, basit Parameterization yine de oluşabilir.Örneğin, aşağıdaki sorgu Zorlanmış parameterization kurallarına göre parametreli yapamazsınız:

SELECT * FROM Person.Address
WHERE AddressID = 1 + 2;

Ancak, bu basit parameterization kurallarına göre parametreli.Zorlanmış parameterization denenir ancak başarısız olduğunda, basit parameterization hala daha sonra yeniden denenir.