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 

в основном я Хейвея базу данных с основными регионами и их позиции гео .. поэтому почтовый индекс 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 в набор подстрок! –

Смежные вопросы