Aracılığıyla paylaş


Yeniden kullanım parametreleri ve yürütme planı

Yürütme planları yeniden parametreleri parametre imleyicileri ado, ole db ve odbc uygulamalarının dahil olmak üzere, kullanımını artırabilir.

Güvenlik notuGüvenlik Notu

Son kullanıcılar tarafından yazılan değerleri daha yürütülen sonra ya da veri erişim API yöntem, execute deyim kullanarak bir dize içine değerleri içinde daha güvenli tutmak için parametreleri veya parametre imleyicileri kullanan veya sp_executesql saklı yordam.

Aşağıdaki iki select deyimleri arasındaki tek fark where yan tümce tümce tümcesinde karşılaştırıldığında değerleri şöyledir:

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

SELECT * 
FROM AdventureWorks2008R2.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 ProductSubcategoryID sütun.Amaç için iken SQL Server ifadeler temelde aynı planı oluşturmak ve yeniden planları her zaman tanımak için SQL Server bazen mu algılamak bu karmaşık sql deyimlerini.

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

  • De Transact-SQLkullanın sp_executesql:

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

    Bu yöntem önerilir Transact-SQL komut dosyaları, saklı yordam veya sql deyimlerini dinamik olarak oluşturan Tetikleyiciler.

  • ado, ole db ve odbc parametre imleyicileri kullanır.Parametre imleyicileri soru yerine bir sql deyim içinde bir sabit ve bir program değişkene bağlı işaretleri (?) ' dir.Örneğin, bir odbc uygulaması aşağıdakileri yapabilirsiniz:

    • Use SQLBindParameter ilk parametre işaretçisi bir tamsayı değişken bağlamak için bir SQL deyim.

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

    • Yürütme deyim, parametre işaretçisi (?) belirten:

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

      The SQL Server Native Client OLE DB Provider and the SQL Server Native Client ODBC driver included with SQL Server use sp_executesql to send statements to SQL Server when parameter markers are used in applications.

  • Tasarım parametrelerini kullanın ve saklı yordamlar tasarlamak için.

Size açıkça parametreleri uygulamalarınızın tasarımı değil oluşturursanız, ayrıca Güvenebileceğin SQL Server sorgu iyileştiricisi için otomatik olarak varsayılan davranışı kullanarak bazı sorgular stratejisinin Basit parameterizasyonunu.alter database PARAMETERİZASYONUNU seçeneği ayarlayarak veritabanındaki tüm sorguları parameterizing göz önünde bulundurulması gereken sorgu iyileştiricisi alternatif olarak, zorla deyim ZORLANAN için.Daha fazla bilgi için bkz: Zorunlu parameterizasyonunu.

Zorla parameterizasyonunu etkinleştirildiğinde, basit parameterizasyonunu yine de ortaya çıkabilir.Örneğin, aşağıdaki sorgu zorla parameterizasyonunu kurallarına göre belirlenmi yapamazsınız:

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

Ancak, bu basit parameterizasyonunu kurallarına göre belirlenmi.Basit parameterizasyonunu zorla parameterizasyonunu denenir ancak başarısız olduğunda, yine de sonradan denenir.