2009-12-10 3 views
0

J'ai deux listes déroulantes, une avec mois et l'autre avec année. L'utilisateur sélectionne le mois et l'année de soumission pour les éléments qu'il souhaite récupérer. Dans la base de données, la date est entrée en entier, par ex. 01/12/2009. Il y a une option pour "Toutes les années" et "Tous les mois" dans les listes déroulantes, mais lorsque les utilisateurs choisissent l'un ou l'autre, ils obtiennent des résultats nuls. Merci beaucoup. Ceci est ma requête:ISNULL Date mois

SELECT ItemID, YEAR(Submit) AS SubmitYear, MONTH(Submit) AS SubmitMonth 
FROM Items 
WHERE (YEAR(Submit) LIKE ISNULL(@YearPay, '')) 
AND (MONTH(Submit) LIKE ISNULL(@MonthPay, '')) 

Mon paramètre sont:

<asp:ControlParameter ControlID="DropDownList1" DefaultValue="" Name="YearPay" PropertyName="SelectedValue" />

<asp:ControlParameter ControlID="DropDownList2" DefaultValue="" Name="MonthPay" PropertyName="SelectedValue" />

+2

Pourquoi avez-vous besoin comme dans la clause where? Ce n'est jamais un match partiel, non? –

+0

vous êtes rught, merci pour votre aide. – Anelim

Répondre

5

Voici une façon de résoudre le problème:

SELECT ItemID, YEAR(Submit) AS SubmitYear, MONTH(Submit) AS SubmitMonth 
FROM Items 
WHERE (YEAR(Submit) = @YearPay OR @YearPay IS NULL) 
AND (MONTH(Submit) = @MonthPay OR @MonthPay IS NULL) 

De cette façon, si vous passer en NULL pour l'une ou l'autre variable, cette partie de la La clause WHERE retournera true.

+0

S'il vous plaît être conscient de la performance, en faisant des appels de fonction sur le champ Soumettre pour obtenir l'année et le mois, vous trouverez les index ne sera pas beaucoup d'utilisation. Pourrait faire très mal si vous avez beaucoup de données – AdaTheDev

1

Une façon assez rapide est de se assurer @YearPay et @MonthPay sont des types de données Integer, passent ensuite dans (par exemple) -1 pour indiquer « ALL », de sorte que votre requête deviendrait:

SELECT ItemID, YEAR(Submit) AS SubmitYear, MONTH(Submit) AS SubmitMonth 
FROM Items 
WHERE (YEAR(Submit) = @YearPay OR @YearPay = -1) 
AND (MONTH(Submit) = @MonthPay OR @MonthPay = -1) 

Cependant, Pour les performances globales, j'éviterais personnellement de le faire de cette manière, en utilisant YEAR() et MONTH() car vous n'obtiendrez pas une bonne utilisation de l'index. Au lieu de cela, je serais tenté de modifier la requête pour accepter simplement une plage de dates, selon laquelle les dates de début et de fin sont générées par votre code .NET en fonction des éléments de liste déroulante sélectionnés.

par exemple.

SELECT ItemID, YEAR(Submit) AS SubmitYear, MONTH(Submit) AS SubmitMonth 
FROM Items 
WHERE (Submit >= @FromDate OR @FromDate IS NULL) 
    AND (Submit < @ToDate OR @ToDate IS NULL) 

Ainsi, en utilisant les exemples suivants pour les sélections mois/année:
janvier 2009 entraînerait @FromDate = '2009-01-01', @ToDate - '2009-02-01'
Tous mois, 2009 entraînerait @FromDate = '2009-01-01', @ToDate = '2010-01-01'
tout mois, une année entraînerait = @FromDate = NULL, NULL @ToDate =

0

Essayez ceci

select * from sys.tables where name like '' 

et ce

select * from sys.tables where name like '%%' 

Cela étant dit, je suis totalement d'accord avec le commentaire de Nebakanezer (et solution).