我有一个带有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})?$'))
)
答案 0 :(得分:9)
SQL Server显然支持this StackOverflow posting的正则表达式,但看起来有一些极端设置。
由于您的过程接受@Zip
作为INT
类型,因此您只需检查它是否介于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]'
这将确保ZIP格式正确,但不保证ZIP实际上被美国邮政服务认可为有效,也不保证ZIP适合街道地址,城市和州