检查Varchar值是否为数字而没有溢出

时间:2012-02-21 08:31:40

标签: sql sql-server-2008 tsql

我有一个包含PostalCode列的表,其类型为Char(10),我使用以下选择查询:

SELECT [Fm].[Id], [Sdp].[FirstName], [Sdp].[LastName], [Sdp].[SSN],
[Sdp].[StoreName],
case when isnumeric([Sdp].[PostalCode]) = 1 then CONVERT(CHAR(10),[Sdp].[PostalCode]) 
else '0' end,  [Fc].[Id], [Sdp].[Address]

FROM [SRM].[SiteMembers].[DProfile] AS [Sdp]
INNER JOIN [SRM].[SiteMembers].[Member] AS [Sm]
ON [Sdp].[Member_Id] = [Sm].[Id]
INNER JOIN [FRM].[Members].[Member] AS [Fm]
ON [Sm].[UserId] = [Fm].[UserId]
INNER JOIN [SRM].[General].[City] AS [Sc]
ON [Sdp].[City_Id]=[Sc].[Id]
INNER JOIN [FRM].[General].[City] AS [Fc]
ON [Fc].[Title]=[Sc].[Title] 
COLLATE SQL_Latin1_General_CP1_CI_AS

使用此脚本执行过流错误,如下所示:

Msg 248, Level 16, State 1, Line 2
The conversion of the varchar value '4153675759' overflowed an int column.

我问了一个问题here并且我不想回到过去的2个脚本,那么有没有办法检查PostalCode是否为数字(我的意思是数字而不是int)没有任何错误?

3 个答案:

答案 0 :(得分:5)

如果您要检查(n)(var)char值是否包含数字和仅数字,那么只需双重否定LIKE即可:

PostalCode not like '%[^0-9]%'

只有在字符串中没有非数字时才会为真。

答案 1 :(得分:1)

使用

case 
    when [Sdp].[PostalCode] like '%[^0-9]%' 
        then 0 else CONVERT(CHAR(10),[Sdp].[PostalCode]) end

答案 2 :(得分:0)

尝试BIGINT。每种numeric数据类型都有一个范围。例如,SMAIINT范围从+32767到-32768。 TINYINT的范围是0到255