2011-03-29 36 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