Нужна хранимая процедура, чтобы взять х количество почтовых индексов - PullRequest
0 голосов
/ 29 марта 2011

Я разрабатываю хранимую процедуру для возврата результатов поиска.

Мне нужно вернуть все квартиры с определенным почтовым индексом ..

Выбор должен делать то, что делает:

select * from tbl_houses
where

(
  (zip_code in (10000,20000,30000,40000))
  or
  (zip_code > 50000 and zip_code < 60000)
)

Другими словами. Мне нужна хранимая процедура, которая может принимать диапазон zip_code и серию zip_codes.

Кто-нибудь знает элегантный способ сделать это?

Мои текущие решения выглядят ужасно, как хххх.

Приветствие Mathias

Ответы [ 2 ]

2 голосов
/ 29 марта 2011

SQL Server 2008?Вы можете передать параметр таблицы: http://msdn.microsoft.com/en-us/library/bb510489.aspx

2005 +?Вы могли бы передать параметр XML со списком значений: http://weblogs.asp.net/jgalloway/archive/2007/02/16/passing-lists-to-sql-server-2005-with-xml-parameters.aspx


OK, грязная мысль 2000 года:

Передать параметр следующим образом:

SET @myParam = "<1234><5678>"

затем в вашем запросе используйте вид, обратный тому, посмотрите, содержит ли параметр желаемое число - <и> используются в качестве разделителей:

SELECT x FROM y WHERE @myParam LIKE '%<' + zipCode + '>%'

Наконец, я нашел этот ресурс:

http://www.sommarskog.se/arrays-in-sql-2000.html#OPENXML

Что даже предполагает, что XML-маршрут возможен с 2000 с sp_xml_preparedocument и т. Д.

1 голос
/ 29 марта 2011

Для этого вы можете использовать функцию Split Table-value:

CREATE FUNCTION [dbo].[Split](@RowData VARCHAR(8000), @SplitOn VARCHAR(5))  
RETURNS @RtnValue TABLE 
(
    Id int identity(1,1),
    Data nvarchar(2000)
) 
AS  
BEGIN 
    Declare @Cnt int
    Set @Cnt = 1

    While (Charindex(@SplitOn,@RowData)>0)
    Begin
        Insert Into @RtnValue (data)
        Select 
            Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)))

        Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData))
        Set @Cnt = @Cnt + 1
    End

    Insert Into @RtnValue (data)
    Select Data = ltrim(rtrim(@RowData))

    Return
END

Затем вы можете использовать его в своей хранимой процедуре, возможно, с другим параметром, указывающим, является ли он диапазоном или списком:

CREATE PROCEDURE dbo.GetHouses(@Zip VARCHAR(8000), @Type INT)
AS
/* 
  @Type:    1 - List
            2 - Range
*/

IF @Type = 1
BEGIN
    SELECT * 
    FROM tbl_houses H
    JOIN dbo.Split(@Zip, ',') S
    ON H.zip_code = S.Data
END
IF @Type = 2
BEGIN
    SELECT * 
    FROM tbl_houses
    WHERE zip_code >= (SELECT Data FROM dbo.Split(@Zip, ',') WHERE Id  = 1)
    AND zip_code <= (SELECT Data FROM dbo.Split(@Zip, ',') WHERE Id  = 2)
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...