2011-02-04 7 views
1

난 .. 영국 우편 번호를 검색하려면이 저장 프로 시저 .. 저장 프로 시저 쿼리 루프

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[sp_postcode_UK] 
    -- Add the parameters for the stored procedure here 
    @post_code varchar(10) 

AS 
DECLARE @intFlag INT 
SET @intFlag = 4 
WHILE (@intFlag >=1) 
BEGIN 

    SET NOCOUNT ON; 

    SELECT top 1 id,lat,lng from [postcodes].[dbo].UKREGIONS 
    where postcode = left(@post_code,@intFlag) 
    order by newid() 

    IF @@rowcount > 0 
    BREAK; 
    SET @intFlag = @intFlag - 1 
    END 
GO 

기본적으로 내가 주요 지역과 지리적 위치와 데이터베이스를졌다 너희가 그렇게 w140df의 우편 번호는에 W14 속할 데이터베이스 ... 때로는 단 하나의 문자로 돌아 간다. 저장 프로 시저가 검색의 처음 몇 가지 빈 레코드를 반환하지 않도록 어떻게해야합니까?

답변

7

당신은 더 정확하게 일치) :

SELECT top 1 id,lat,lng from [postcodes].[dbo].UKREGIONS 
where postcode IN (
    left(@post_code,1), left(@post_code,2), 
    left(@post_code,3), left(@post_code,4) 
) 
ORDER BY LEN(postcode) DESC 

루핑 할 필요가 없습니다.

좋아요, 사용할 수도 있지만 더 좋지 않을 것 같습니다.

SELECT top 1 id,lat,lng from [postcodes].[dbo].UKREGIONS 
where @post_code LIKE postcode+'%' 
ORDER BY LEN(postcode) DESC 

LIKE 절에서 매개 변수와 열의 역순에 유의하십시오.

+0

와우 .. 꽤 영리합니다. 감사합니다. – Alessandro

+1

+1. LIKE를 하위 문자열 집합으로 분해하는 아주 훌륭한 아이디어입니다! –