2011-02-04 2 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 

基本的に私は、メインの地域とその地理位置を使用してデータベースをhavea ..のでw140dfの郵便番号は、中W14に属しますデータベース...ときどき1文字に戻ることがあります。どのようにしてストアドプロシージャが検索の最初のカップルの空レコードを返さないようにしますか?

答えて

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を部分文字列のセットに分解するには、どのような素晴らしいアイディアが必要ですか? –

関連する問題