
2026年开年第一坑SQL Server 从安装到日常操作的完整梳理2026年1月20日元旦刚过没多久手头正好接了个小项目需要在Windows Server上部署一套SQL Server环境供业务系统使用。本来以为就是“下一步下一步”的事结果从版本选择到安装完成再到建库建表、性能排查零零碎碎踩了不少坑。趁这几天有空把这些经验整理成一篇实操笔记围绕SQL Server的安装、基础操作、查询优化和日常问题排查几个方向全部过一遍。无论你是刚接触数据库的学生还是从MySQL转过来的开发又或者是被临时拉去救火的运维这篇文章都适用读完能少走很多弯路。先说一个很多人问的问题SQL Server到底选哪个版本其实版本选对了后面能省一大半麻烦。我这次安装的是SQL Server 2022 Standard原因很简单项目需要正式环境Express版虽然免费但内存限制1GB、数据库大小限制10GB对生产业务来说太憋屈。如果只是学习入门完全可以装Express版功能上和正式版几乎一样日常练手完全够用。1. 安装之前先想清楚版本选哪个、装之前要准备什么1.1 版本选择2019还是2022Express够不够用SQL Server目前主流版本是2019和20222008和2012已经属于老古董了除非是接手遗留系统否则不建议新装。2016和2017卡在中间功能上没有质变Veeam等备份软件的支持也没问题但对新项目来说不是最优选择。版本之间怎么选我按实际情况总结了一张表版本适用场景内存限制数据库大小限制备注Express学习、小工具、测试环境1GB10GB每库免费官网直接下Standard中小型生产环境操作系统上限无需要授权支持高可用Enterprise大型业务、高并发操作系统上限无功能最全价格也最高另外还有Developer版本功能和Enterprise一样但只允许开发和测试使用不可以用于生产环境。学习SQL Server、看执行计划、研究索引调优用Developer版免费且无功能阉割这是微软留给学习者的一大福利别浪费。选择版本时还要考虑一个问题业务场景需要哪些高级功能。比如Always On可用性组Standard版从2016开始支持基本版但只允许一个辅助副本Enterprise版支持更多副本和只读路由。如果是简单的主备场景Standard版够用如果需要复杂的读写分离预算充足就直接Enterprise。1.2 安装前检查清单与常见坑很多人一上来就下载安装包结果装到一半报错然后到处找答案。其实安装前的环境检查做足了90%的问题都可以提前避免。我这次实际踩过的一个坑就是Windows Server上的.NET Framework版本太旧安装程序直接弹窗提示缺组件被迫中断。安装前建议按这个清单过一遍操作系统版本SQL Server 2022要求Windows 10 1607以上或Windows Server 2016以上并且是64位系统。32位系统只能装老版本这个不必纠结。.NET FrameworkSQL Server 2022需要.NET Framework 4.7.2以上装之前可以去“控制面板-程序-启用或关闭Windows功能”里检查。缺了就去微软官网下个运行时补上。磁盘空间完整安装大概需要6GB以上算上后续数据库文件增长和数据备份建议至少预留20GB。只装数据库引擎会小一些但别卡着线装。内存Express版理论上512MB就能跑但实际使用会卡到怀疑人生。新装环境建议4GB起步Windows本身就要吃2GB左右。防火墙安装过程中会自动放行1433端口但如果你的环境里预先配置了安全策略装完后检查一下防火墙规则别让外部客户端连不上。安装账户建议给SQL Server服务创建独立账户不要用管理员账户跑服务。虽然单机学习环境怎么弄都没事但生产环境的安全基线还是得做好。还有一个很常见的困惑是下载时不知道去哪里找安装包。微软官网的SQL Server下载页面是最靠谱的来源输入关键词“SQL Server下载”就能找到官方入口。第三方下载站虽然有时候确实能下到完整ISO但安全风险太高尤其是公司环境被装了后门软件就麻烦了。百度网盘分享的安装包同样来路不明强烈不建议在生产环境使用官方渠道下载慢一点也无所谓安全第一。2. 动手安装从下载到SSMS连上数据库2.1 安装SQL Server数据库引擎的完整步骤我这次装的SQL Server 2022 Standard过程比想象中顺利可能是因为版本比较新安装程序对Windows Server 2022的适配已经很成熟了。下面按步骤写一下实际操作流程。第一步右键下载好的安装程序选择“以管理员身份运行”。这一步很关键不要直接双击否则UAC提示出来时选择“是”也可以但在部分企业环境中非管理员账户双击会导致安装程序在写入系统目录时权限不足装一半就退出了。第二步安装程序启动后界面会分几个选项选择“全新SQL Server独立安装或向现有安装添加功能”。如果只是首次安装选这个就好。不要选“从SQL Server安装媒体升级”那是给老版本升级用的。第三步产品密钥页面。Standard版需要输入密钥Developer版则需要勾选“指定可用版本”然后选Developer。密钥在购买时的邮件里如果是MSDN订阅在Azure门户的订阅权益页面可以找到。千万别把密钥放U盘里搞丢了补发流程很折磨人。第四步许可条款页面直接勾选“我接受许可条款”接着会进入功能选择页。对于大多数场景至少需要勾选“数据库引擎服务”和“客户端工具连接”。SSMSSQL Server Management Studio不在这个安装包里需要单独下载安装。其他像Integration Services、Analysis Services这些不是BI项目就不要勾装多了不仅没意义还给系统服务增加负担。第五步实例配置页面。默认的“默认实例”会在连接时用机器名或localhost直接访问端口自动用1433。如果你打算在一台机器上装多个SQL Server实例就选择“命名实例”连接时写成“机器名\实例名”。我一般建议独立环境用默认实例省事但如果机器上已经有一个老实例了新装一个命名实例互不干扰更稳妥。第六步服务器配置页面。这里配置SQL Server服务的启动账户和排序规则。默认的排序规则是SQL_Latin1_General_CP1_CI_AS一般不用改除非你确定业务有特殊需求。CI表示不区分大小写AS表示区分重音大多数中文业务系统用默认就好。第七步数据库引擎配置页面里有几个关键设置。身份验证模式选“混合模式”也就是SQL Server身份验证加Windows身份验证然后设置sa密码。很多教程让你只选Windows身份验证说这样更安全但实际开发中各种工具的连接串都需要SQL账号到头来还得改回混合模式。设密码时别用弱密码生产环境被扫到sa弱口令密码是迟早的事。下面可以勾选“添加当前用户”这样后续用SSMS登录时可以直接用Windows身份验证不用记密码。第八步后面的错误报告、临时目录选项保持默认即可一路Next最后检查安装配置没问题就点“安装”。安装过程大概10到20分钟期间会装实例共享目录、运行检查规则、配置服务等等到进度条跑完出现“安装完成”的界面就说明数据库引擎已经装好了。2.2 安装SSMS并完成第一次连接数据库引擎装完只是第一步第二步是装SSMS。SSMS就是SQL Server的管理工具相当于图形化的操作台建库建表跑查询都在里面完成。坏消息是SSMS需要单独下载好消息是微软把下载页面放在了专门的SSMS下载地址免费且更新频率高一般一个月左右一个小版本。下载后直接双击安装安装过程相对简单选择安装位置即可。装完后在开始菜单里找到“Microsoft SQL Server Management Studio 18”或“20”版本号取决于你下载的哪个打开后弹出连接对话框。连接配置如下服务器类型数据库引擎服务器名称填写localhost或者机器名如果是命名实例就写localhost\实例名身份验证Windows身份验证或者SQL Server身份验证填sa和密码点击“连接”后左侧对象资源管理器里会显示数据库列表包括系统数据库master、model、msdb、tempdb以及你自己建的库。此时SQL Server已经可以正常使用了。我第一次装的时候遇到过一个问题SSMS连不上报错提示“已成功与服务器建立连接但在登录过程中发生错误”。原因是当时只选了Windows身份验证防火墙又没放行1433端口外部工具连接全被拦了。后来把身份验证改成混合模式在SQL Server配置管理器里启用了TCP/IP协议才能正常连接。如果你也遇到连不上问题按这个思路检查协议是否启用、防火墙是否放行、服务是否启动、身份验证模式是否正确。2.3 安装失败与连接报错快速处理安装和连接过程中报错是常态遇到问题先别慌绝大多数都有规律。我遇到过的主要有几种安装时提示“此版本的SQL Server需要.NET Framework 4.7.2”解决方式是去“设置-应用-可选功能”或“控制面板-程序和功能-启用或关闭Windows功能”中确认.NET Framework状态缺了就装装完重启再运行安装程序。安装后SSMS登录报“无法连接到localhost”第一步确认“SQL Server服务”是否启动。按下WinR输入services.msc找到“SQL Server (实例名)”服务状态是“正在运行”才算正常。如果没启动右键启动并把启动类型改成“自动”否则服务器重启后数据库服务不会自动拉起。连接时报“客户端无法建立到SQL Server的连接”优先检查SQL Server配置管理器——打开后选择“SQL Server网络配置-实例名的协议”右侧确保TCP/IP已启用双击TCP/IP去IP地址页把IPAll里的TCP端口填成1433。防火墙问题SQL Server安装时通常会添加防火墙入站规则但如果你换过端口或者安装时取消了防火墙配置就需要手动新增规则放行1433端口或对应实例的端口。有一类问题在SQL Server 2008上非常经典想删除数据库但一直提示失败。原因是SQL Server 2008包括2008 R2在删除数据库时会检查该数据库是否正在被使用如果有连接占用比如其他人开着SSMS查询删除就会卡住或者报错。解决办法是先将数据库设置为“单用户模式”再删除或者先杀掉占用连接的进程。虽然新版本SQL Server在这方面有所改进但在并发环境下依然会遇到类似问题执行删除操作前一定要确认没有业务连接正在使用。3. 建库建表与增删改查把最基本的操作练熟3.1 创建数据库与数据表安装和连接搞定后接下来就是日常最频繁的操作了。SQL Server的日常操作核心可以分成三个部分建库建表、增删改查、查询优化。把这三个练熟日常开发基本就不会慌了。先看创建数据库。SSMS图形化的操作方式是在对象资源管理器里右键“数据库”选“新建数据库”填一个数据库名称比如ProjectDB然后点击“确定”。SQL Server会自动生成一个主数据文件.mdf和一个日志文件.ldf默认放在安装目录的DATA文件夹下。我更推荐直接写T-SQL语句来创建尤其是需要脚本化交付的环境CREATE DATABASE ProjectDB ON PRIMARY ( NAME NProjectDB, FILENAME ND:\Data\ProjectDB.mdf, SIZE 100MB, MAXSIZE UNLIMITED, FILEGROWTH 64MB ) LOG ON ( NAME NProjectDB_log, FILENAME ND:\Data\ProjectDB_log.ldf, SIZE 64MB, MAXSIZE UNLIMITED, FILEGROWTH 64MB );这里有几个细节值得注意文件路径尽量放在独立的业务数据盘不要和系统盘混在一起否则磁盘IO互相干扰。SIZE是初始大小FILEGROWTH是自动增长步长。生产环境建议把初始大小设置成接近实际容量的值避免频繁自动增长造成碎片。MAXSIZE设为UNLIMITED是上限不设限制但实际生产环境建议设一个上限防止某个失控任务把磁盘写满。创建数据表的语句也很基础但参数和类型选不对后面会很被动。以一个用户信息表为例CREATE TABLE dbo.Users ( UserID INT IDENTITY(1,1) NOT NULL PRIMARY KEY, UserName NVARCHAR(50) NOT NULL, Email NVARCHAR(100) NULL, CreatedDate DATETIME NOT NULL DEFAULT(GETDATE()) );这里有三个点要说明NVARCHAR和VARCHAR的区别NVARCHAR存Unicode能存中文和各种字符VARCHAR只能存非Unicode字符。只要业务有中文输入统一用NVARCHAR别在这上面省空间。IDENTITY(1,1)表示自增相当于MySQL的AUTO_INCREMENT每次插入数据自动加1不用手动指定。DEFAULT(GETDATE())会在插入数据时自动填充当前时间省得每次写INSERT都必须带上时间字段。如果你是从MySQL转过来的会明显感觉到两者的差异MySQL中用AUTO_INCREMENTSQL Server用IDENTITYMySQL中反引号包围标识符SQL Server用方括号MySQL中类型有TINYINT、DATETIME等SQL Server类型更丰富比如DATETIME2、SMALLDATETIME。这些差异不算大但写语句时容易混淆。3.2 增删改查语句与自增主键建好表之后就是增删改查这部分语法和标准SQL基本一致直接上示例。插入数据INSERT INTO dbo.Users (UserName, Email) VALUES (张三, zhangsanexample.com);不需要写UserID字段IDENTITY自增列会自动生成。如果一次插入多条数据可以写成INSERT INTO dbo.Users (UserName, Email) VALUES (李四, lisiexample.com), (王五, wangwuexample.com);查询数据SELECT UserID, UserName, Email, CreatedDate FROM dbo.Users WHERE UserName LIKE N%张% ORDER BY CreatedDate DESC;这里注意LIKE配合中文条件时前面最好加上N前缀表示后面的字符串是Unicode字符否则某些排序规则下会查不到结果。这个坑很隐蔽我见过不少人在中文模糊查询时明明有数据却查不出来就是少了这个N。更新数据UPDATE dbo.Users SET Email newnameexample.com WHERE UserID 1;删除数据DELETE FROM dbo.Users WHERE UserID 1;DELETE和TRUNCATE的区别也值得说一下DELETE是逐行删除可以加WHERE条件会记录事务日志删除速度慢但可控TRUNCATE是直接释放整个表的数据页不能加WHERE速度快但不可恢复。如果只是想清空表数据而保留表结构用TRUNCATE更合适但如果要保留事务日志以便误删恢复还是老老实实用DELETE。3.3 常用时间函数与字符串函数SQL Server的时间函数和字符串函数是日常写查询时最高频的工具集。很多人从MySQL转过来后拿到时间字段不知道怎么处理这里把最常用的一批整理出来。时间函数方面-- 当前时间 SELECT GETDATE(); -- 返回带毫秒的日期时间 SELECT SYSDATETIME(); -- 返回更高精度的日期时间 SELECT CURRENT_TIMESTAMP; -- 等价于GETDATE() -- 日期部分提取 SELECT DATEPART(YEAR, GETDATE()); -- 当前年份 SELECT DATEPART(MONTH, GETDATE()); -- 当前月份 SELECT DAY(GETDATE()); -- 当前日 SELECT DATENAME(WEEKDAY, GETDATE()); -- 星期几返回中文或英文名称 -- 日期加减 SELECT DATEADD(DAY, 7, GETDATE()); -- 七天后 SELECT DATEADD(MONTH, -1, GETDATE()); -- 一个月前 -- 日期差 SELECT DATEDIFF(DAY, 2026-01-01, 2026-01-20); -- 结果为19 -- 格式化 SELECT FORMAT(GETDATE(), yyyy-MM-dd HH:mm:ss);FORMMAT函数虽然方便但性能比CONVERT差不少。如果要对几十万行数据做格式化输出建议用CONVERT配合样式号SELECT CONVERT(VARCHAR(19), GETDATE(), 120); -- 输出 yyyy-MM-dd HH:mm:ss字符串函数方面最常用的是SELECT LEN(Nabc); -- 3返回字符数 SELECT DATALENGTH(Nabc); -- 6返回字节数 SELECT LEFT(Nabcdef, 3); -- abc SELECT RIGHT(Nabcdef, 3); -- def SELECT SUBSTRING(Nabcdef, 2, 3); -- bcd从第2位开始取3个 SELECT CHARINDEX(Nc, Nabcdef); -- 3查找子串位置 SELECT REPLACE(Nabcabc, Nbc, Nxy); -- axyaxy SELECT UPPER(Nabc); -- ABC SELECT LOWER(NABC); -- abc这里有一个容易踩坑的点LEN和DATALENGTH的区别。LEN返回的是字符个数但会忽略尾部空格DATALENGTH返回的是字节数不忽略尾部空格。对中文字符来说DATALENGTH往往是LEN的两倍因为每个中文字符占两个字节。比如LEN(N你好)是2DATALENGTH(N你好)是4。如果你模糊查询时发现结果数量不对大概率是没意识到这个差异。4. 查询优化别等慢到受不了才想起来4.1 索引怎么加、加在哪如果只是学基础操作前面的内容已经可以应付很多场景了。但SQL Server用得越久越能感受到查询优化的重要性尤其是数据量上来之后一个糟糕的查询可以把整个数据库拖垮。查询优化的核心是索引。索引相当于书的目录没有索引的查询就是整本书从头翻到尾速度必然慢。SQL Server的索引主要分为聚集索引和非聚集索引两种。聚集索引决定了表数据的物理存储顺序每张表只能建一个默认就是主键。非聚集索引是单独存储的索引结构每张表可以建很多个查询时先查索引再根据索引中的书签找到对应的数据行。加索引的原则从实际经验来说总结成几条针对WHERE条件中频繁出现的字段加索引。针对JOIN的关联字段加索引。针对ORDER BY排序字段加索引避免额外的排序操作。选择性高的字段比选择性低的字段更适合建索引。比如“性别”字段只有男和女两种值建索引意义不大而“Email”字段几乎每条都不一样建索引效果就非常明显。不要对频繁更新的字段建太多索引每次INSERT、UPDATE、DELETE都要同步更新索引会增加额外开销。创建索引的语句CREATE NONCLUSTERED INDEX IX_Users_Email ON dbo.Users(Email);查询时如果发现SQL Server选择走索引执行计划里会显示“Index Seek”比“Table Scan”快得多。4.2 查看执行计划定位慢查询光知道加索引还不够得知道问题到底出在哪里。SQL Server提供了一个非常强大的可视化工具——执行计划。在SSMS里选中一条查询语句点击工具栏上的“显示估计的执行计划”或直接按CtrlL就能看到SQL Server会怎么执行这条SQL。执行计划会展示一串图标从右往左读每个图标代表一种操作比如Clustered Index Scan聚集索引扫描、Index Seek索引查找、Nested Loops嵌套循环、Hash Match哈希匹配、Sort排序。其中比较“贵”的操作是扫描和排序扫描表示没用上索引排序表示额外内存和CPU开销。定位慢查询的标准思路是使用SQL Server Profiler或扩展事件跟踪慢查询找到耗时长、读取量大的SQL语句。在SSMS中复制该SQL查看执行计划看哪些操作占比最高。针对占比最高的操作做优化加索引、重写查询、拆分大事务。优化后对比执行计划和IO统计确认提升效果。查看IO统计是一个容易被忽略但很实用的技巧。在SSMS中执行以下命令然后再跑查询SET STATISTICS IO ON; SET STATISTICS TIME ON; SELECT * FROM dbo.Users WHERE Email zhangsanexample.com;消息选项卡里会显示“逻辑读取次数”。逻辑读取次数越低说明查询效率越高。优化前几千次优化后几十次这个对比比任何理论都直观。关于SQL Server Profiler每次要新建模板的时候默认模板可以覆盖90%的跟踪需求。网上很多“SQL Server Profiler模板下载”的资源其实没必要去找自己在SQL Server Profiler里新建跟踪勾选SQL:BatchCompleted和SQL:StmtCompleted事件筛选CPU和Duration超过阈值的语句就足够了。模板这东西自己建一次以后直接复用还更顺手。4.3 内存占用过高的排查思路SQL Server还有一个让运维头疼的问题内存占用太高。装完SQL Server后你可能会发现Windows任务管理器里SQL Server进程占用了大量物理内存但这是在不出问题时的正常现象。SQL Server默认会尽可能多地占用可用内存作为缓冲池用来缓存数据页减少磁盘IO。如果不希望SQL Server把内存吃满可以在服务器属性里设置“最大服务器内存”。设置方法有两种。一种是SSMS图形化右键服务器选择“属性”点击“内存”把“最大服务器内存”改成一个合理的值。更推荐用T-SQL设置因为可以在脚本中统一管理EXEC sp_configure show advanced options, 1; RECONFIGURE; EXEC sp_configure max server memory, 8192; -- 单位为MB这里设置8GB RECONFIGURE;这里有个关键点给SQL Server分配的最大内存不等于整个系统的内存要预留一部分给Windows操作系统和应用程序。经验值是如果服务器有32GB内存给SQL Server设24GB左右剩下8GB给OS和监控代理等程序。排查“SQL Server Windows NT占用内存”问题时先要判断是正常缓存还是内存泄漏。正常缓存的表现是长时间运行后内存占用稳定在一个高位重新启动服务后内存释放之后又慢慢涨上来异常的表现是内存持续增长不回落甚至触发操作系统级的内存压力其他应用开始卡顿。两者处理思路完全不同正常缓存调低最大服务器内存即可异常情况则要看具体等待类型比如PAGEIOLATCH_SH和PAGEIOLATCH_EX过高说明内存压力大且磁盘IO跟不上。5. 容易被忽略的日常维护与问题排查5.1 无法删除数据库的常见原因日常维护中经常遇到一类问题删除数据库时失败报错提示“数据库正在使用无法删除”。直观感受是“明明没人用啊怎么就删不掉”。这种情况通常是几个原因引起的SSMS的对象资源管理器或查询窗口里占用着该数据库。比如有查询窗口执行了USE ProjectDB这时数据库就一直有外部连接。后台作业、报表订阅或第三方工具持有数据库连接。数据库正处于单用户模式或只读模式。解决办法先杀掉占用连接再删库。查询当前有哪些进程SELECT session_id, login_name, status FROM sys.dm_exec_sessions WHERE database_id DB_ID(ProjectDB);找到阻塞的session_id后可以杀掉KILL 57; -- 把57换成实际session_id如果连接太多不便逐个查看直接把数据库设为单用户模式再删除ALTER DATABASE ProjectDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE; DROP DATABASE ProjectDB;这里WITH ROLLBACK IMMEDIATE很关键它会把还未提交的事务回滚掉强制断开所有连接。生产环境执行前一定要确认没有正在跑的重要事务一旦回滚那些事务的执行结果就没有了。SQL Server 2008/2008 R2里这个问题更突出。老版本的SQL Server在删除大数据库时如果数据文件很大删除操作本身就很慢加上2008对并发连接的承受能力弱点单用户模式基本成了删库标配步骤。如果你还在维护SQL Server 2008环境建议尽早规划升级毕竟扩展支持已经结束安全风险会越来越大。5.2 客户端连接错误08001排查还有一个非常常见的连接报错文本大概是这样的[08001] [Microsoft][ODBC Driver 18 for SQL Server]命名管道提供程序: 无法打开与SQL Server的连接这个报错会出现在很多场景里比如通过ODBC连接SQL Server、用Python的pyodbc连接、用Power BI导入数据时。看起来是命名管道Named Pipes的问题但实际上并不一定要使用命名管道。SQL Server客户端默认的连接方式和连接字符串密切相关。默认的连接协议顺序是Shared Memory、TCP/IP、Named Pipes。如果连接字符串里没有指定协议客户端会按顺序尝试。报错提到命名管道无法打开可能的原因包括TCP/IP协议未启用客户端尝试了TCP/IP失败后回退到命名管道也失败。防火墙阻断了1433端口导致TCP/IP根本无法建立连接客户端自动降级到命名管道。连接字符串里明确指定了“Named Pipes”作为协议但是SQL Server配置管理器里的Named Pipes协议被禁用了。目标SQL Server实例不在本机命名管道跨机器访问时还需要额外的netbios解析更容易出问题。排查思路很简单。第一检查SQL Server配置管理器把TCP/IP和Named Pipes都启用。第二检查防火墙确保1433端口可访问。第三在连接字符串里显式指定TCP/IP协议比如conn_str ( DRIVER{ODBC Driver 18 for SQL Server}; SERVER192.168.1.100,1433; DATABASEProjectDB; UIDsa; PWD你的密码; Encryptyes;TrustServerCertificateyes; )注意ODBC Driver 18及以后版本默认启用Encryptyes如果SQL Server没有配置证书连接会失败。解决方式是在连接字符串里显式加上Encryptyes;TrustServerCertificateyes如果在你自己的可控环境里直接加上Encryptno也可以但生产环境建议还是配证书。Python程序员在Windows上连接SQL Server时很喜欢用pyodbc但配置不熟时最容易踩两个坑一个是ODBC驱动版本不对32位程序用了64位的ODBC驱动另一个是连接超时把连接池的空闲超时错当成连接超时去调结果毫无作用。我的习惯是检查驱动时执行import pyodbc print(pyodbc.drivers())把输出的驱动名和连接字符串里的DRIVER名称一一对应确保完全一致。5.3 正则表达式与SQL Server的边界另一个经常引起新手混乱的问题是SQL Server和正则表达式的关系。很多人用过MySQL的REGEXP到了SQL Server发现没有直接对应的函数就开始怀疑是不是自己没找到。实际上SQL Server从2022版本开始内置了正则表达式函数REGEXP_LIKE、REGEXP_SUBSTRING和REGEXP_REPLACE但需要数据库兼容级别达到160才能使用。如果用的还是2019版本就需要用LIKE配合通配符来做简单的模式匹配或者用CLR自定义函数扩展正则能力。比如用LIKE查询以“张”开头的用户名SELECT UserName FROM dbo.Users WHERE UserName LIKE N张%;LIKE的通配符只有几个%匹配任意长度字符串_匹配单个字符[abc]匹配集合中的任意一个字符[^abc]匹配不在集合中的字符。这个能力对于简单的模式匹配是够用的但复杂场景比如校验电话号码格式、提取特定模式文本LIKE就力不从心了。SQL Server 2022的正则表达式写法SELECT UserName FROM dbo.Users WHERE REGEXP_LIKE(UserName, N^张);这个功能目前用的人还不多因为很多线上环境还停留在2019甚至更老版本。需要跨版本兼容时要么改写为LIKE要么在应用层处理正则逻辑不建议为了一个正则功能拉高数据库版本。在版本升级计划里把这个需求列进去等版本升上去后再切换到原生正则。这个例子也说明了版本和功能之间的强关系。SQL Server 2022相比2019本机在备份压缩、TLS 1.3支持、Intelligent Query Processing等方面都有增强但升级数据库版本是一个系统工程涉及兼容性评估、回归测试、备份恢复策略不是说升就升的。网上很多“SQL Server 2022下载”的资源下载安装前先确认你所在组织的许可和合规要求个人学习环境则无所谓装就完了。5.4 常用维护脚本和备份策略最后补充几个日常维护中非常实用的小脚本。这些脚本都是我在实际使用中验证过的随取随用。检查所有数据库的大小SELECT db.name AS DatabaseName, CAST(SUM(mf.size) * 8 / 1024.0 AS DECIMAL(12, 2)) AS SizeMB FROM sys.databases db JOIN sys.master_files mf ON db.database_id mf.database_id GROUP BY db.name ORDER BY SizeMB DESC;查看当前正在运行的请求SELECT r.session_id, r.status, r.command, DB_NAME(r.database_id) AS DatabaseName, r.wait_type, r.wait_time, r.cpu_time, r.total_elapsed_time FROM sys.dm_exec_requests r ORDER BY r.total_elapsed_time DESC;这个查询对排查阻塞和死锁特别有用。如果看到某个session_id的wait_type是LCK_M_X说明它在等一把排他锁大概率就是阻塞源。备份数据库的常规语句BACKUP DATABASE ProjectDB TO DISK ND:\Backup\ProjectDB_20260120.bak WITH INIT, COMPRESSION;备份文件命名最好带上日期方便保留策略做轮转。配合SQL Agent作业可以做到每天自动备份、每周完整备份、每小时日志备份但前提是你愿意花时间配置维护计划生产环境这是必须的投入。微软最近大力推广SQL Server 2022的备份到对象存储功能也就是直接把备份文件写入Azure Blob或S3兼容存储这对异地容灾很有帮助。不过目前在生产环境落地还不多等生态再成熟一些异地容灾的复杂度会大幅降低。写在最后的几个经验其实SQL Server安装和入门不难难的是遇到问题时知道去哪里分析和排查。这次从安装到建库建表再到查询优化和问题排查走了一遍有几个感触特别深安装前多花十分钟检查环境比装到一半报错再回头找原因省事得多。版本选择别贪新也别念旧根据业务需求来学习用Developer或Express生产用Standard大并发高可用场景再考虑Enterprise。查询优化这件事别等到数据库卡顿才想起来。写SQL时养成看执行计划的习惯逻辑读从几千降到几十的成就感比堆一堆功能代码实在得多。日常维护脚本提前准备好出问题时不用临时网上搜数据库出问题时候每一分钟都很宝贵。最后分享一个小习惯我在建表时都会把表和字段的说明加上用SQL Server的扩展属性功能或者在表设计器的“说明”列里写清楚。一个人维护的项目可能看不出差别但团队协作时注释就是最低成本的知识传递机制。这也算是踩过好几年“代码看得懂表结构看不懂”的苦头后总结出来的经验。