惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
Apple Machine Learning Research
Apple Machine Learning Research
The Cloudflare Blog
WordPress大学
WordPress大学
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 叶小钗
博客园 - 聂微东
阮一峰的网络日志
阮一峰的网络日志
腾讯CDC
博客园 - 三生石上(FineUI控件)
V
V2EX
有赞技术团队
有赞技术团队
V
Visual Studio Blog
小众软件
小众软件
Jina AI
Jina AI
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - Franky
量子位
T
Tailwind CSS Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
P
Palo Alto Networks Blog
Cisco Talos Blog
Cisco Talos Blog
I
Intezer
Project Zero
Project Zero
A
Arctic Wolf
P
Privacy International News Feed
V
Vulnerabilities – Threatpost
L
Lohrmann on Cybersecurity
S
Securelist
C
Cybersecurity and Infrastructure Security Agency CISA
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Tor Project blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
S
Security @ Cisco Blogs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Google DeepMind News
Google DeepMind News
N
News and Events Feed by Topic
TaoSecurity Blog
TaoSecurity Blog
L
LINUX DO - 热门话题
G
GRAHAM CLULEY
Help Net Security
Help Net Security
N
News | PayPal Newsroom
W
WeLiveSecurity
G
Google Developers Blog
Microsoft Security Blog
Microsoft Security Blog
Engineering at Meta
Engineering at Meta
MongoDB | Blog
MongoDB | Blog
C
Check Point Blog

博客园 - Insus.NET

User Profile Service 服务未能登录 Visual Studio2026创建Vue项目 安装与配置node.js HTTP Error 403.14 - Forbidden VisualStudio2026回滚上一版本 消息认证码(加强) 网站无法使用插值字符串语法 HMAC(Hash-based Message Authentication Code)认证示例 浏览器自动发送域凭据 企业内小网站兼用Windows验证登录 访问用户控件的函数 onblur事件改为监听处理 将警报消息改为吐司消息 内容有无变化OnBlur即时更新引起的问题与解决 混合式提高用户编辑与操作效率 光标离开文框后即刻更新 WebForm实现Web API JavaScript对GridView删除行后并重新给其数据绑定 把CS值传给JS使用 v2 确认信息confirm由C#后端移至javascript前端 无法发布网站Web Site JavaScript判断字符是否为decimal 点击单元格弹出窗口处理数据返回父页 GridView数据控件中实现单选功能 文本框输入完后直接按回车提交数据 GridView对行进行全选或单选 TextBox文本框允许用户输入正或负小数 用户单击文本并复制至剪帖板 Vue3格式化日期时间与插值 MS SQL Server 数据加密与解密实例 相册由原来Lightbox升级至Vue2瀑布流 从Visual Studio 2022升级至Visual Studio 2026 报表应用图表charts显示数据 钉钉(DingTalk)免登录 Upgrade Outlook Connector 程序中真实应用SignalR Web API路径与IIS站点应用程序名或虚拟目录 在您可以登录前,此副本的 Windows 必须被 Microsoft 激活。您想现在激活它吗 电脑系统由Win10降级Win7折腾还是折腾 System.ComponentModel.Win32Exception: Access is denied
SQL Server中验证大小字母和数字
Insus.NET · 2025-12-26 · via 博客园 - Insus.NET

在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来实现。