2010-02-18 7 views
0

J'ai une fonction SQL avec SQL suivante dans:Comment transmettre une liste de valeurs à comparer dans une fonction SQL dans SQL Server 2008?

SELECT StockID FROM (SELECT DISTINCT StockID, 
ROW_NUMBER() OVER(ORDER BY DateAdded DESC) AS RowNum 
FROM Stock 
WHERE CategoryCode LIKE @CategoryID) AS Info 
WHERE RowNum BETWEEN @startRowIndex AND (@startRowIndex + @maximumRows) - 1 

J'ai un paramètre @CategoryID - mais je dois prendre dans une pièce d'identité de la catégorie tels que « BA » et a traduit une liste des ID de catégorie tels que « IE », « EG » etc donc ma clause WHERE ressemble à:

WHERE (CategoryCode LIKE 'IE' OR CategoryCode LIKE 'EG') AS Info 

J'ai une table de consultation qui contient le code « BA », puis tous les codes réels de la catégorie, cela signifie par exemple que « IE » et "EG". Comment est-ce que j'ai l'extension de catégorie à plusieurs instructions "OR" dans ma fonction SQL? Je ne sais pas comment faire, quelqu'un peut-il résoudre ce problème? À l'heure actuelle la requête telle que montrée peut faire face à un CategoryID tel que "IE", ceci est fait comme je veux une page de catégorie telle que category.aspx où un paramètre "BA" est passé tel que category.aspx? category = BA et cette page listera tous les articles avec les codes de catégorie "EG" et "IE".

La raison pour laquelle j'ai besoin de ceci est qu'il y a un code de catégorie "parent" qui a plusieurs codes de catégorie "enfants" qui sont différents du code parent. J'utilise ASP.NET et .NET 3.5 sur le front-end si cela aide.

+0

Y a-t-il une bonne raison de ne pas utiliser LINQ to SQL ici? –

+0

J'ai seulement utilisé LINQ pour XML donc je ne sais pas comment le faire pour SQL, mais une idée intéressante. – RoguePlanetoid

+0

comment votre requête peut-elle avoir 2 clauses WHERE? –

Répondre

5

Essayez d'utiliser

WHERE CategoryCode IN (
    SELECT LookupCategoryCode 
    FROM LookupTable 
    WHERE LookupCategoryId = @CategoryId 
) 

Remplacement de "LookupCategoryCode", "LookupTable" et "LookupCate" goryId "pour les valeurs respectives dans votre table de recherche.

+0

+1, je tapais juste ça, bat moi à ça! –

+0

Je suis sûr que j'ai essayé quelque chose comme ça, mais je vais essayer à nouveau. La plupart des combinaisons que j'essayais ont entraîné une augmentation des temps de lecture, j'essaie de les réduire au minimum. – RoguePlanetoid

+0

Avec les index en place, ça devrait aller. Toutefois, si la performance * vraiment * devient critique, vous pouvez utiliser une procédure stockée pour générer la requête sql, puis l'exécuter via sp_executesql [http://msdn.microsoft.com/de-de/library/ms188001.aspx]. Mais assurez-vous de tester d'abord car vous devez prendre en compte les frais généraux pour l'écriture et la maintenance de la procédure stockée. – AxelEckenberger

0

En supposant que le paramètre est une liste délimitée commune de

de categoryID

Essayez

WHERE charindex(','+CategoryCode+',',','[email protected]+',') > 0 

Performance ne sera pas grande, mais il devrait faire l'affaire pour vous

+0

La performance est une exigence - c'est pour le code de production. – RoguePlanetoid

+0

OK, ce qui précède fonctionne pour les petites tables et est une solution facile, mais l'utilisation de fonctions comme ci-dessus dans une clause WHERE ne doit pas être utilisée pour une base de données importante. On dirait que vous avez des réponses supplémentaires, bonne chance avec votre application. – Sparky

Questions connexes