Sql server 2005 将varchar值“*”转换为数据类型int时,转换失败

Sql server 2005 将varchar值“*”转换为数据类型int时,转换失败,sql-server-2005,while-loop,Sql Server 2005,While Loop,我在SQLServer2005中运行嵌套while循环时遇到了这个问题 我的外循环得到一次迭代,然后我的内循环得到它的完整的第一次迭代,但是我在内循环之后的语句从未执行过,这似乎破坏了一切 我现在迷路了,我觉得我错过了一些很容易的事情,非常感谢你的帮助 while exists(select top 1 ident from #tmpAttorneyImport (nolock) where parsed = 0 and zipcode <> '') begin set @intC

我在SQLServer2005中运行嵌套while循环时遇到了这个问题

我的外循环得到一次迭代,然后我的内循环得到它的完整的第一次迭代,但是我在内循环之后的语句从未执行过,这似乎破坏了一切

我现在迷路了,我觉得我错过了一些很容易的事情,非常感谢你的帮助

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
结束

你有多确定你的数据是干净的

我会在这两行后面加上:

print @vcrMinZip
print @vcrMaxZip
并查看从字符串中实际解析出的内容

解释:

最有可能的@vcrMinZip数据类型是“[VAR]CHAR3” 当@vcrMinZip变量的值为“999”时,故障将从选择@vcrMinZip=convertint开始,@vcrMinZip+1行,因为选择@vcrMinZip=convertint,“999”+1表示选择@vcrMinZip=999+1-=1000。 所以您需要将4位INT 1000值转换为VARCHAR3变量。这意味着SQL Server必须截断结果。在这种情况下,SQL Server将给出另一个结果:*=结果长度太短,无法显示 有关更多信息,请参阅MSDN中的部分。 例如:

DECLARE  @vcrMinZip VARCHAR(3);
SELECT @vcrMinZip = CONVERT(INT, '999') + 1;
SELECT  @vcrMinZip;

Results

----
*

(1 row(s) affected)
你能做什么

对@vcrMinZip和@vcrMaxZip使用INT或SMALLINT。 将所有convertint、@vcrMinZip和convertint、@vcrMaxZip转换替换为@vcrMinZip和@vcrMaxZip。 替换zipcode=case。。。什么时候以更简单的方式结束:zipcode=RIGHT'000000000'+CONVERTVARCHAR10,@vcrMinZip,3-3=您需要多少字符
我已经在这个位置进行了调试,我看到了我期望的数据-在本例中,min=995,max=999。
DECLARE  @vcrMinZip VARCHAR(3);
SELECT @vcrMinZip = CONVERT(INT, '999') + 1;
SELECT  @vcrMinZip;

Results

----
*

(1 row(s) affected)