2008-09-27 20 views
5

Sorun: tariflerde [n] içindekiler hakkındaSQL Server: Dinamik nerede fıkra

Ajax önermek arama. Yani: birçok malzemeye karşı tarifleri eşleştirin.

Örneğin

: SELECT Recipes using "flower", "salt" üretecektir: benzeri "Pizza", "Bread", "Saltwater" ve.

Tablolar:

Ingredients [ 
    IngredientsID INT [PK], 
    IngredientsName VARCHAR 
] 

Recipes [ 
    RecipesID INT [PK], 
    RecipesName VARCHAR 
] 

IngredientsRecipes [ 
    IngredientsRecipesID INT [PK], 
    IngredientsID INT, 
    RecipesID INT 
] 

Sorgu: Şu anda çünkü WHERE maddesinin dinamik doğasının ASP.NET C# kullanarak benim sorgu inşa ediyorum

SELECT 
    Recipes.RecipesID, 
    Recipes.RecipesName, 
    Ingredients.IngredientsID, 
    Ingredients.IngredientsName 
FROM 
    IngredientsRecipes 

    INNER JOIN Ingredients 
    ON IngredientsRecipes.IngredientsID = Ingredients.IngredientsID 

    INNER JOIN Recipes 
    ON IngredientsRecipes.RecipesID = Recipes.RecipesID 
WHERE 
    Ingredients.IngredientsName IN ('salt', 'water', 'flower') 

.

Ben teoride çok daha hızlı olması gereken bir saklı yordam/saf SQL, kullanmak yerine benim kod katmanda sorgusunu oluşturmak zorunda olduğunu ısırır.

siz bana saf SQL benim kod katmandan mantığın tüm hareket edeceğini, ya da en azından ben ne yapıyorum performansını optimize nasıl nasıl herhangi bir düşünce var mı?

Birinci adım: SELECT IngredientsID FROM Ingredients ve INSERT INTO temp-table

İkinci adım:

Ben geçici tablolar çizgisinde düşünüyorum SELECT RecipesName FROM Recipes size şekline bağlı temp-table.IngredientsID

cevap

7

İki seçeneğiniz vardır. SQL Server 2008 (veya Oracle) kullanıyorsanız, table value parameter'dan geçirebilirsiniz. SQL Server 2005 kullanıyorsanız, 2005 den önceki bir şeyler kullanıyorsanız

, sen XML to simulate this capability

kullanabilirsiniz, tek dizede kimlikleri birleştirir ve bunları ayrıştırmak için bir UDF oluşturmanız gerekir.

+0

Müthiş haberler, Mike. Çok teşekkürler! :) – roosteronacid

2

ile katıldı IngredientsRecipes katıldı Bu mevcut yöntemin bazı sql enjeksiyon riskleri olduğunu düşünüyorum giriş bileşenlerini işliyor.

Sen hızlı olabilir katılmak koşullara ingrediant adını ekler olabilir.

Ayrıca hızlı arama için yemek tarifleri için malzemeler kombinasyonlarını karma olabilir.

+0

. Senaryo enjeksiyon sorunları da benim endişemden biri. "Yapma" konusunda detay verir misiniz? – roosteronacid

+0

Kullanıcı, içerdiği olası içeriklerin bir listesinden birini seçerseniz, içerikler tablosunda, bu ifadeleri program ifadesinde, nerede bulunduğunuz yerde ve enjeksiyon sorunu olmadan kullanabilirsiniz. – Brettski

+0

E.g. Bir tuzlu su unu ekleyerek bir MD5 veya SHA1 hash işlemek, bir değer (sizin hash) alırsınız.Aramanızda, buna uyan bir öğeye bakabilirsin. Bir liste yerine bir değer karşılaştırırken daha hızlı olacaktır. – alexmac

3

En azından parametrize olabilir clausule SQL enjeksiyonu, hem bir şeyler önlemek için burada: Kabul ediyorum

using System.Data; 
using System.Data.SqlClient; 
using System.Text; 

class Foo 
{ 
    public static void Main() 
    { 
     string[] parameters = {"salt", "water", "flower"}; 
     SqlConnection connection = new SqlConnection(); 
     SqlCommand command = connection.CreateCommand(); 
     StringBuilder where = new StringBuilder(); 
     for (int i = 0; i < parametes.Length; i++) 
     { 
      if (i != 0) 
       where.Append (","); 
      where.AppendFormat ("@Param{0}", i); 
      command.Parameters.Add (new SqlParameter ("Param" + i, parameters [i])); 
     } 
    } 
} 
+0

Evet. Potansiyel enjeksiyonlarla ilgileniyordum. Mike Brown, bir dahi inme ile geldi. Ama çaba arkadaşın için teşekkürler. – roosteronacid