2011-11-02 1 views
0

J'ai hérité d'un db etc d'un autre développeur et j'ai besoin d'aide.SQL SP avec plusieurs valeurs pour une entrée

J'ai la procédure stockée suivante:

CREATE PROCEDURE [dbo].[TESTgetSearchResults] 
    (
    @ids varchar(100), 
    @Date DateTime = Null, 
    @Date2 DATETIME = Null, 
    @Sort VARCHAR(5), /* ASC or DESC */ 
    @SortBy VARCHAR(10), /* Sorting criteria */ 
    @Location VARCHAR(40) 
    ) 
AS 
    SELECT @Date = GetDate() 
    SELECT @Date2 = DATEADD(day,-14,GETDATE())  

BEGIN 
    SELECT Aircraft.Id AS AircraftID, AircraftManufacturers.Name, AircraftModels.ModelName, 
    Aircraft.ModelSuffix, Aircraft.ImageFileName, Aircraft.Year, Aircraft.SerialNo, 
    Locations.DescriptionForSite, Aircraft.Description, Aircraft.Description2, 
    Aircraft.InfoWebAddress, Aircraft.ImageDescription, Advertisers.Id AS AdvertisersID, 
    Advertisers.Name AS AdvertisersName, Aircraft.AircraftDataId, Aircraft.ForSale, Aircraft.ForLease, 
    Aircraft.TTAF, Aircraft.ReSend, Aircraft.ReSendReason, Aircraft.Registration, Aircraft.AdType, 
    Aircraft.HasAlternateImage, Aircraft.AlternateImageDescription, 
    Aircraft.Price, AircraftModels.AircraftType, Advertisers.CurrentEMagLink, Aircraft.CurrentEMagLink, 
    Aircraft.Email, Aircraft.IsSold, Aircraft.SoldDate, Aircraft.DateAdded, Aircraft.ExtendedDetails, 
    Aircraft.LastUpdateDate, Aircraft.ImageCount, Aircraft.ContactTelephone, AircraftModels.id, Advertisers.IsPremiumAdvertiser, 
    Aircraft.Location, Advertisers.ContactTelephone As AdvertisersTelephone, Aircraft.EndDate, Aircraft.VideoLink, 
    Aircraft.Contact, Advertisers.WASSalesEmail, Advertisers.WASSalesEmail2, Aircraft.PriceNumeric, 
    Aircraft.PriceQualifier, Aircraft.Currency, Aircraft.AircraftDescription 
    FROM (((Aircraft 
    INNER JOIN Advertisers ON Aircraft.AdvertiserId = Advertisers.Id) 
    INNER JOIN AircraftModels ON Aircraft.AircraftModelId = AircraftModels.Id) 
    INNER JOIN AircraftManufacturers ON AircraftModels.ManufacturerId = AircraftManufacturers.Id) 
    INNER JOIN Locations ON Aircraft.LocationId = Locations.Id 
    JOIN iter$simple_intlist_to_tbles(@ids) i ON AircraftModels.id = i.number 
    WHERE (Aircraft.IsActive=1 AND Advertisers.IsActive=1 AND Aircraft.IsSold=0 AND (Aircraft.EndDate>[email protected] OR Aircraft.EndDate Is Null) AND Locations.Id = @Location) 
    OR (Aircraft.IsActive=1 AND Advertisers.IsActive=1 AND Aircraft.IsSold=1 AND Aircraft.SoldDate>[email protected] AND Locations.Id = @Location) 
    ORDER BY Advertisers.IsPremiumAdvertiser ASC, Aircraft.DateAdded DESC, Aircraft.ListPosition DESC, 
    Aircraft.LastUpdateDate, AircraftManufacturers.Name, AircraftModels.ModelName, Aircraft.ModelSuffix, 
    Aircraft.Id DESC 
END 

iter simple_intlist_to_tbles $ (@ids) simple, crée une table de l'entrée de @ids. Cette entrée se présente sous la forme d'une chaîne de chiffres séparés par un ',' par exemple, 1, 2, 3, 4, etc ...

Maintenant, je dois remplacer le @Location par une chaîne des ID d'emplacement formatés de la même manière, par exemple, 1, 2, 3, 4, etc ...

Donc mon problème est ceci ... Comment puis-je adapter la procédure sql/stockée ci-dessus afin que les deux clauses 'WHERE' qui filtrent en fonction d'un seul emplacement, peuvent maintenant prendre plusieurs ID de lieu ??????

Toute aide serait vraiment appréciée.

Merci.

Répondre

1

Pour résoudre votre problème, récupérer simplement les valeurs de iter $ simple_intlist_to_tbles (@location) dans un sous-requête, et vérifier les avec IN:

AND Locations.Id IN (SELECT * FROM iter$simple_intlist_to_tbles(@Location)) 

Votre clause where est plus complexe qu'il doit être. Il y a des exigences ET identiques dans chaque OR, vous pouvez donc les déplacer en dehors de la RO. Il simplifie à:

WHERE Aircraft.IsActive=1 
AND Advertisers.IsActive=1 
AND ((Aircraft.IsSold=0 AND (Aircraft.EndDate>[email protected] OR Aircraft.EndDate Is Null)) 
    OR (Aircraft.IsSold=1 AND Aircraft.SoldDate>[email protected])) 
AND Locations.Id IN (SELECT * FROM iter$simple_intlist_to_tbles(@Location)) 
+0

Merci pour cela !!!! Vraiment apprécié. –

0

En utilisant un sous-requête comme: DE bla ... ET Locations.Id IN (Sélectionner le numéro iter $ (simple_intlist_to_tbles de @locations))

Questions connexes