需要在SQL Server存储过程中验证美国邮政编码

use*_*164 4 sql-server stored-procedures

我有一个带有2个可选参数的存储过程,如下所示.我需要验证其中一个可选参数@Zip,即我需要确保用户在执行此存储过程时输入正确的美国邮政编码.我尝试使用正则表达式,如下面的存储过程,但它不起作用.请让我知道如何实现这一目标?谢谢.

                     CREATE PROCEDURE usp_GetDetails
                     (
                       @Name varchar(255) = null, @Zip int = null
                      )
                     as
                     begin
         SELECT DISTINCT
         [Name],[Address1],[Address2],[City],[Zip]
         FROM    AddressTable
         WHERE 
             ( @Name IS NULL
                      OR AddressTable.[Name] LIKE '%' + @Name + '%'
                     )
                AND  ( @Zip IS NULL
                     OR AddressTable.[Zip] = (RegexMatch (@Zip, '^\d{5}(\-\d{4})?$'))
                     )
Run Code Online (Sandbox Code Playgroud)

Ed *_*bbs 10

根据这个StackOverflow发布,SQL Server显然支持正则表达式,但看起来有一些极端设置.

由于您的过程接受@ZipINT类型,因此您只需检查它是否在0到99,999之间.但这与你试图的正则表达式不一致,而且我建议使用Aaron指出的字符类型.

如果@Zip是字符类型,则SQL Server LIKE足够健壮以验证它.这将检查ZIP是5位数还是9位数或"5位数加上破折号加4位数":

IF   @Zip LIKE '[0-9][0-9][0-9][0-9][0-9]'
  OR @Zip LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
  OR @Zip LIKE '[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'
Run Code Online (Sandbox Code Playgroud)

这将确保ZIP格式正确,但不保证ZIP实际上被美国邮政服务认可为有效,也不保证ZIP适合街道地址,城市和州.