2011-11-02 109 views
0

我从另一个开发者继承了数据库等,并需要一些帮助。SQL SP用多个值的输入

我有以下存储过程:

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)简单构建从@ids输入的表。这个输入是以一个由',',例如1,2,3,4等分隔的一系列ID号形式出现的。

现在我需要用@字符串替换@Location 3在此同样的方式如,1,2格式的位置标识,,,,4,等....的

所以我的问题是这样的...我如何适应上面的SQL /存储过程,以该滤波器基于单个位置处两“WHERE”子句,现在能够采取的多个位置的ID ??????

任何帮助将非常感激。

谢谢。

回答

1

解决您的问题,简单地检索ITER $ simple_intlist_to_tbles值(@Location),并用IN来检查它们:

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

你的where子句也是更复杂的,它需要。有相同的,要求在每个OR,所以你可以或外部它们移动。它简化为:

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

谢谢你的!非常感谢。 –

0

通过使用像一个子查询: FROM等等... AND Locations.Id IN(SELECT数量从ITER $ simple_intlist_to_tbles(@locations))