4

我有一个带有 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})?$'))
                     )
4

1 回答 1

11

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

由于您的过程接受@Zip作为一种INT类型,因此您只需检查它是否在 0 到 99,999 之间。但这与您尝试的正则表达式不一致,另外我建议使用上面 Aaron 指出的字符类型。

如果@Zip是字符类型,则 SQL ServerLIKE足够健壮以对其进行验证。这将检查 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]'

这将确保 ZIP 格式正确,但不能保证 ZIP 确实被美国邮政服务识别为有效,也不能保证 ZIP 适合街道地址、城市和州。

于 2013-03-26T03:58:36.680 回答