2011-03-29 38 views
0

我正在設計一個存儲過程以返回搜索結果。需要存儲過程需要x個郵編

我需要所有的公寓返回具有特定郵政編碼..

的選擇應該做什麼這樣做:

select * from tbl_houses 
where 

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

換句話說。我想要一個存儲過程,既可以使用zip_code範圍,也可以使用一系列zip_codes。

任何人都知道這樣做的優雅方式?

我現在的解決方案跟xxxx一樣醜陋。

乾杯 馬蒂亞斯

回答

1

您可以使用拆分表值函數此:

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 
+0

乾淨,簡單的方法 – Slappy 2011-03-30 00:21:59

+0

輝煌的解決方案:)我非常感謝。 – MathiasH 2011-03-30 12:38:58

2

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

+0

對於2005年的XML建議+1。我使用了很多;它還可以提高性能,因爲您可以使用一次數據庫命中而不是每次記錄一次來更新整行負載的行。 – 2011-03-29 14:47:22

+0

非常感謝,在2005+上完美工作,但是我的運氣讓它成爲我需要的唯一SQL 2000服務器。 – MathiasH 2011-03-29 14:51:13

+0

我已經添加了一個狡猾的2000基於LIKE的東西,基於傳遞一個長參數並在WHERE子句中搜索。它的醜陋雖然 – 2011-03-29 15:17:44