Ошибка преобразования при преобразовании значения varchar '*' в тип данных int - PullRequest
0 голосов
/ 05 октября 2011

Я получаю эту проблему, когда запускаю вложенные циклы while в sql server 2005.

Мой внешний цикл получает одну итерацию, а затем мой внутренний цикл получает полную первую итерацию, но мое утверждение послевнутренний цикл никогда не выполняется, что, кажется, нарушает все.

Я сейчас потерян и чувствую, что упускаю что-то очень простое, любая помощь очень ценится.

while exists(select top 1 ident from #tmpAttorneyImport (nolock) where parsed = 0 and zipcode <> '')
begin

set @intCurrentIdent = 0
set @vcrCurrentAttonreyName = ''
set @vcrCurrentZip = ''

select top 1 @intCurrentIdent = ident from #tmpAttorneyImport (nolock) where parsed = 0
select @vcrCurrentAttonreyName = ltrim(rtrim(attorneyname)) from #tmpAttorneyImport (nolock) where ident = @intCurrentIdent
select @vcrCurrentZip = ltrim(rtrim(zipcode)) from #tmpAttorneyImport (nolock) where ident = @intCurrentIdent

if(len(@vcrCurrentZip) > 3)
 begin

    set @vcrMinZip = ''
    set @vcrMaxZip = ''

    select @vcrMinZip = ltrim(rtrim(left(@vcrCurrentZip, 3)))
    select @vcrMaxZip = ltrim(rtrim(right(@vcrCurrentZip, 3)))

    while(convert(int, @vcrMinZip) <= convert(int, @vcrMaxZip)) -- sql is telling me this line has the error
     begin

        insert into #tmpAttorneysFormatted(
            attorneyname,
            zipcode
        )
        select
            attorneyname = @vcrCurrentAttonreyName,
            zipcode = case
                        when len(@vcrMinZip) = 1 then '00' + ltrim(rtrim(@vcrMinZip))
                        when len(@vcrMinZip) = 2 then '0' + ltrim(rtrim(@vcrMinZip))
                        when len(@vcrMinZip) = 3 then ltrim(rtrim(@vcrMinZip))
                      end

        select @vcrMinZip = convert(int, @vcrMinZip) + 1        

     end

    -- this statement does not get hit
    update #tmpAttorneyImport
    set
        parsed = 1
    where
        ident = @intCurrentIdent

 end
else
 begin

    insert into #tmpAttorneysFormatted(
        attorneyname,
        zipcode
    )
    select
        attorneyname = @vcrCurrentAttonreyName,
        zipcode = case
                    when len(@vcrCurrentZip) = 1 then '00' + ltrim(rtrim(@vcrCurrentZip))
                    when len(@vcrCurrentZip) = 2 then '0' + ltrim(rtrim(@vcrCurrentZip))
                    when len(@vcrCurrentZip) = 3 then ltrim(rtrim(@vcrCurrentZip))
                  end

        update #tmpAttorneyImport
        set
            parsed = 1
        where
            ident = @intCurrentIdent

 end

конец

Ответы [ 2 ]

1 голос
/ 05 октября 2011

Пояснения:

  1. Скорее всего @vcrMinZip тип данных `[VAR] CHAR (3)
  2. Когда значение переменной @vcrMinZip равно '999', проблемы начинаются со строки select @vcrMinZip = convert(int, @vcrMinZip) + 1, поскольку SELECT @vcrMinZip = convert(int, '999') + 1 означает SELECT @vcrMinZip = 999 + 1 -- = 1000.
  3. Итак, вы хотите преобразовать 4-значное значение INT (1000) в переменную VARCHAR(3). Это означает, что SQL Server должен усечь результат. В этом случае вместо усечения SQL Server выдаст другой результат: * («* = Длина результата слишком мала для отображения») Дополнительные сведения см. В разделе Результаты усечения и округления в разделе «MSDN».
* * 1 022 Пример: * 1 023 *
DECLARE  @vcrMinZip VARCHAR(3);
SELECT @vcrMinZip = CONVERT(INT, '999') + 1;
SELECT  @vcrMinZip;

Results

----
*

(1 row(s) affected)

Что вы можете сделать?

  • Используйте INT ИЛИ SMALLINT для @vcrMinZip и @vcrMaxZip.
  • Заменить все преобразования convert(int, @vcrMinZip) и convert(int, @vcrMaxZip) на @vcrMinZip и @vcrMaxZip.
  • Замените zipcode = case ... when .... end на что-то гораздо более простое: zipcode = RIGHT('000000000'+CONVERT(VARCHAR(10),@vcrMinZip), 3) -- 3 = how many chars do you need
0 голосов
/ 05 октября 2011
select @vcrMinZip = ltrim(rtrim(left(@vcrCurrentZip, 3)))
select @vcrMaxZip = ltrim(rtrim(right(@vcrCurrentZip, 3)))

Насколько вы уверены, что ваши данные чисты?

Я бы вставил (сразу после этого) две строки:

print @vcrMinZip
print @vcrMaxZip

и посмотрите, что на самом деле анализируется из строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...