SQL SP с несколькими значениями для входа - PullRequest
0 голосов
/ 02 ноября 2011

Я унаследовал базу данных и т. Д. От другого разработчика и мне нужна помощь.

У меня есть следующая хранимая процедура:

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>=@Date OR Aircraft.EndDate Is Null) AND Locations.Id = @Location)
    OR (Aircraft.IsActive=1 AND Advertisers.IsActive=1 AND Aircraft.IsSold=1 AND Aircraft.SoldDate>=@Date2 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 builds aтаблица из ввода @ids.Эти входные данные представлены в виде строк с номерами идентификаторов, разделенных символом ',', например, 1, 2, 3, 4 и т. Д.

Теперь мне нужно заменить @Location настрока идентификаторов местоположений, отформатированных таким же образом, например, 1, 2, 3, 4 и т. д.

Так что моя проблема заключается в следующем ... Как мне адаптировать вышеуказанный sql /хранимой процедуры, так что два предложения «WHERE», которые фильтруют на основе одного местоположения, теперь могут принимать несколько идентификаторов местоположения. ??????

Любая помощь будет по достоинству оценена.* Спасибо.

Ответы [ 2 ]

1 голос
/ 02 ноября 2011

Чтобы решить вашу проблему, просто извлеките значения из iter $ simple_intlist_to_tbles (@Location) в подзапросе и проверьте их с помощью IN:

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

Предложение where также более сложное, чем ему нужнобыть.В каждом OR есть одинаковые требования AND, поэтому вы можете переместить их за пределы OR.Это упрощает до:

WHERE Aircraft.IsActive=1 
AND Advertisers.IsActive=1 
AND ((Aircraft.IsSold=0 AND (Aircraft.EndDate>=@Date OR Aircraft.EndDate Is Null))
  OR (Aircraft.IsSold=1 AND Aircraft.SoldDate>=@Date2))
AND Locations.Id IN (SELECT * FROM iter$simple_intlist_to_tbles(@Location))
0 голосов
/ 02 ноября 2011

Используя такой подзапрос, как: ОТ бла ... И Locations.Id IN (ВЫБЕРИТЕ номер ОТ ИТОРА $ simple_intlist_to_tbles (@locations))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...