SQL Server中验证大小字母和数字

在SQL Server开发中,有必要验证某个字符是否为大写字母,小写字母和数字:
Insus.NET的写法,分别写了3个函数,

验证字符是否为大写字母:
2025-12-26_16-40-15

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Author,,Insus.NET>
-- Create date: <Create Date, ,2025-12-26>
-- Description:    <Description, ,验证字符是否为大写字母>
-- =============================================
 CREATE FUNCTION [dbo].[svf_IsDaxieLetter] 
(
  @Value NVARCHAR(4000)
) RETURNS BIT
AS
BEGIN    
    RETURN CASE WHEN LEN(ISNULL(@Value,'')) = 1 
    AND @Value NOT LIKE '[0-9]'
    AND ASCII(@Value) >= 65  
    AND ASCII(@Value) <= 90 
    AND UPPER(@Value) COLLATE Latin1_General_CS_AS = @Value THEN 1 ELSE 0 END
END
GO
View Code

 

验证字符是否为小写字母:
2025-12-26_17-01-27

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Author,,Insus.NET>
-- Create date: <Create Date, ,2025-12-26>
-- Description:    <Description, ,验证字符是否为小写字母>
-- =============================================
CREATE FUNCTION [dbo].[svf_IsXiaoxieLetter] 
(
  @Value NVARCHAR(4000)
) RETURNS BIT
AS
BEGIN    
    RETURN CASE WHEN LEN(ISNULL(@Value,'')) = 1 
    AND @Value NOT LIKE '[0-9]'
    AND ASCII(@Value) >= 97  
    AND ASCII(@Value) <= 122
    AND LOWER(@Value) COLLATE Latin1_General_CS_AS = @Value THEN 1 ELSE 0 END
END
GO
View Code

 

验证字符是否为数字:
2025-12-26_17-03-38

 

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Author,,Insus.NET>
-- Create date: <Create Date, ,2025-12-26>
-- Description:    <Description, ,验证字符是否为数字>
-- =============================================
CREATE FUNCTION [dbo].[svf_IsShuzi] 
(
  @Value NVARCHAR(4000)
) RETURNS BIT
AS
BEGIN    
    RETURN CASE WHEN LEN(ISNULL(@Value,'')) = 1 
    AND @Value LIKE '[0-9]'
    AND ASCII(@Value) >= 48  
    AND ASCII(@Value) <= 57 THEN 1 ELSE 0 END
END
GO
View Code


写这几个函数,是因为在数据插入数据时,需要验证输入的数据是否符合规则,
应用如下,验证生产线名, 大写字母开始,紧跟是1位或2位数字,但跟字母的数字不能为0

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Author,,Insus.NET>
-- Create date: <Create Date, ,2025-12-26>
-- Description:    <Description, ,验证产线名是否符合规则>
-- =============================================
CREATE FUNCTION [dbo].[svf_ValidateProducingLineName]   
(
    @Value NVARCHAR(4000)
) 
RETURNS BIT
AS
BEGIN    
    DECLARE @returnResult BIT = 0

    SET @Value = LTRIM(RTRIM(@Value))

    IF LEN(ISNULL(@Value,'')) >= 2 AND LEN(ISNULL(@Value,'')) <= 3
    BEGIN
        DECLARE @firstCharacter NVARCHAR(1) = SUBSTRING(@Value,1,1)

        IF ISNULL(@firstCharacter,'') <> '' AND [dbo].[svf_IsDaxieLetter](@firstCharacter) <> 0
        BEGIN
            DECLARE @secondCharacter NVARCHAR(1) = SUBSTRING(@Value,2,1)
            DECLARE @thirdCharacter NVARCHAR(1) = SUBSTRING(@Value,3,1)
            
            IF ISNULL(@secondCharacter,'') <> ''
            BEGIN
                 IF [dbo].[svf_IsShuzi](@secondCharacter) <> 0 
                 BEGIN
                    IF @secondCharacter = 0  --紧跟字母的数字不能为0
                    BEGIN
                        SET @returnResult = 0
                    END
                    ELSE
                    BEGIN                        
                        IF ISNULL(@thirdCharacter,'') <> ''   --第3位字符
                        BEGIN
                            IF [dbo].[svf_IsShuzi](@thirdCharacter) <> 0
                            BEGIN
                                SET @returnResult = 1
                            END
                            ELSE
                            BEGIN
                                SET @returnResult = 0
                            END    
                        END
                        ELSE
                        BEGIN
                            SET @returnResult = 1
                        END
                    END
                 END
                 ELSE
                 BEGIN
                    SET @returnResult = 0
                 END
            END
            ELSE
            BEGIN
                SET @returnResult = 0
            END            
        END
        ELSE
        BEGIN
            SET @returnResult = 0
        END
    END
    ELSE
    BEGIN
        SET @returnResult = 0
    END

    RETURN @returnResult 
END

 

实现起来,是有些复杂。
最后是一个存储过程,

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Author,,Insus.NET>
-- Create date: <Create Date, ,2025-12-26>
-- Description:    <Description, ,添加产线>
-- =============================================
CREATE PROCEDURE [dbo].[usp_ProducingLine_Insert]
    @PD NVARCHAR(5),
    @Line NVARCHAR(20),
    @CreatedBy NVARCHAR(30)
AS
BEGIN
    SET NOCOUNT ON;
    
    -- 去除空格
    SET @Line = LTRIM(RTRIM(@Line))
    
    -- 验证生产线名 
    IF [dbo].[svf_ValidateProducingLineName](@Line) = 0
    BEGIN
        RAISERROR(N'生产线名称[%s]不符合规则。', 16, 1, @Line)
        RETURN
    END
    
    IF ASCII(LEFT(@Line, 1)) <> ASCII(@PD)
    BEGIN
        RAISERROR(N'生产线名称[%s]前缀与车间名称[%s]匹配。', 16, 1, @Line, @PD)
        RETURN
    END

    -- 检查是否已存在
    IF EXISTS(SELECT 1 FROM [dbo].[Producing_Line] 
              WHERE [PD] = @PD AND [Line] = @Line)
    BEGIN
        RAISERROR(N'车间[%s]生产线[%s]已经添加。', 16, 1, @PD, @Line)
        RETURN
    END

    DECLARE @line_number SMALLINT = CAST(SUBSTRING(@Line,2,2) AS SMALLINT)
    
    -- 插入数据
       
END

 

供管理员或提供给前端应用。

关联与扩展,使用二进制来验证,亦是另外一个方法,
2025-12-26_17-21-05

 

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Author,,Insus.NET>
-- Create date: <Create Date, ,2025-12-26>
-- Description:    <Description, ,验证大写字母 version 1>
-- =============================================
CREATE FUNCTION [dbo].[svf_ValidateProducingLineName_v1]   
(
    @Value NVARCHAR(4000)
) 
RETURNS BIT
AS
BEGIN    
    DECLARE @returnResult BIT = 0
    
    SET @Value = LTRIM(RTRIM(@Value))

    IF LEN(ISNULL(@Value,'')) IN (2,3)
    BEGIN
        -- 使用二进制排序规则确保大小写敏感
        IF (@Value LIKE '[A-Z][1-9]' COLLATE Latin1_General_BIN AND LEN(@Value) = 2) 
            OR
           (@Value LIKE '[A-Z][1-9][0-9]' COLLATE Latin1_General_BIN AND LEN(@Value) = 3)
            BEGIN
                SET @returnResult = 1
            END
    END

    RETURN @returnResult
END
GO
View Code

 

根据实际需求,再次修改验证函数:
2025-12-26_17-27-29

 

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Author,,Insus.NET>
-- Create date: <Create Date, ,2025-12-26>
-- Description:    <Description, ,验证大写字母 version 2>
-- =============================================
CREATE FUNCTION [dbo].[svf_ValidateProducingLineName_v2]   
(
    @Value NVARCHAR(4000)
) 
RETURNS BIT
AS
BEGIN    
   -- 去除首尾空格
    SET @Value = LTRIM(RTRIM(ISNULL(@Value, '')))
    
    -- 长度必须是2或3
    IF LEN(@Value) NOT IN (2, 3)
        RETURN 0
    
    -- 第一个字符必须是大写字母
    IF ASCII(LEFT(@Value, 1)) NOT IN(SELECT [ASCII_CODE] FROM [dbo].[Producing_Department]) --结合自己实际需求,字母还要跟车间字母致
        RETURN 0
    
    -- 第二个字符必须是1-9的数字
    DECLARE @secondChar CHAR(1) = SUBSTRING(@Value, 2, 1)
    IF @secondChar NOT BETWEEN '1' AND '9'
        RETURN 0
    
    -- 如果是3个字符,第三个必须是数字
    IF LEN(@Value) = 3
    BEGIN
        DECLARE @thirdChar CHAR(1) = SUBSTRING(@Value, 3, 1)
        IF @thirdChar NOT BETWEEN '0' AND '9'
            RETURN 0
    END    
    RETURN 1
END
GO
View Code

 

SQL Server 使用正则,操作起来有些难度。验证字母,方法很多,建议使用排序,二制制和ASCII来实现。




posted @ 2025-12-26 17:39  Insus.NET  阅读(0)  评论(0)    收藏  举报