SQL-Server: Dynamische where-Klausel
Problem:
Ajax suggest-Suche auf [n] Zutaten in den Rezepten. Das heißt: match Rezepte gegen mehrere Zutaten.
Zum Beispiel: SELECT Recipes using "flower", "salt"
produzieren würde: "Pizza", "Bread", "Saltwater"
und so weiter.
Tabellen:
Ingredients [
IngredientsID INT [PK],
IngredientsName VARCHAR
]
Recipes [
RecipesID INT [PK],
RecipesName VARCHAR
]
IngredientsRecipes [
IngredientsRecipesID INT [PK],
IngredientsID INT,
RecipesID INT
]
- Abfrage:
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')
Ich bin derzeit am Bau meine Abfrage mit ASP.NET C# aufgrund der dynamischen Natur des WHERE
- Klausel.
Ich Bisse, die ich zum erstellen der Abfrage in meinem code-Ebene anstelle der Verwendung einer gespeicherten Prozedur/Reine SQL -, die in der Theorie sollte viel schneller sein.
Haben Sie Jungs haben keine Gedanken darüber, wie ich würde zu bewegen alle Logik aus meinem code-Ebene zu reinem SQL, oder zumindest, wie kann ich optimieren der Leistung von dem, was ich mache?
Ich denke entlang der Linien von temporären Tabellen:
Schritt eins: SELECT IngredientsID FROM Ingredients
und INSERT INTO temp-table
Schritt zwei: SELECT RecipesName FROM Recipes
trat mit IngredientsRecipes
trat mit temp-table.IngredientsID
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie zwei Möglichkeiten. Wenn Sie mit SQL Server 2008 (oder Oracle) Sie kann in eine Tabelle value-parameter.
Wenn Sie SQL Server 2005 verwenden, können Sie XML simulieren diese Funktion
Wenn Sie etwas früher als 2005, müssen Sie zum verketten von ids in einem einzigen string und erstellen einer UDF-Datei zu analysieren Sie.
Konnte man sich wenigstens einstellen, wo die clausule zu vermeiden, SQL-injection, etwas gleichermaßen:
Je nachdem, wie Sie der Verarbeitung der Eingabe Inhaltsstoffe ich denke, das aktuelle Methode hat einige sql-injection-Risiken.
Könnte man anfügen, die ingrediant Namen der join-Bedingungen, die möglicherweise schneller sein.
Könnte man auch hash-Kombinationen von Zutaten für Rezepte verwenden, die für eine schnelle Suche.