开发者工具 · 数据库

SQL Server 速查

T-SQL/函数/系统视图

✓本地处理 · 不上传 ✓免费 · 无需登录 ✓无次数限制 累计 110 次使用

SQL Server 命令速查

T-SQL / 函数 / 系统视图 · 点击复制

第一节

关于本工具

About

写 T-SQL 时,总在系统视图和函数名之间来回翻文档。这个工具把 SQL Server 常用系统视图、内置函数和命令按类别整理成速查表,点开即看语法与示例。所有内容静态存储在浏览器中,无需联网,适合 DBA 调优时快速定位视图名,或开发者在写复杂查询前确认函数参数顺序。

使用场景

壹

审计排查死锁

凌晨 2 点,财务系统报错,SQL Server 日志里全是死锁图。DBA 需要从 300 行的死锁报告里找出哪个存储过程、哪张表、哪条索引导致了循环等待。本工具的系统视图速查表直接列出 sys.dm_tran_locks 和 sys.dm_os_waiting_tasks 的核心字段含义与关联查询模板,按图索骥 5 分钟定位到是某张订单表的页锁冲突,改隔离级别后恢复。

贰

迁移脚本语法适配

从 SQL Server 2008 迁移到 2022,原库用了大量非标准 T-SQL(如 FOR XML PATH 拼接、OUTPUT INTO 临时表)。开发组长要在一周内完成 200 个存储过程的语法兼容性检查。本工具按功能分类列出已废弃(如 TEXT、IMAGE 类型)和新增语法(如 STRING_AGG、TRIM),逐条对照修改,避免编译报错。

叁

临时报表字段解析

运营总监要一份「近 30 天新注册用户的首单转化率」,但原始表字段名是 u_createtime、order_ts、status_cd,没有中文注释。数据分析师用本工具查 SQL Server 系统视图 sys.columns 的扩展属性查询语法,直接拉出字段描述,5 分钟确认 u_createtime 是注册时间、status_cd 的 3 代表已支付,避免写错 JOIN 条件重跑。

肆

索引碎片评估

电商大促后,订单表碎片率飙升到 60%,查询从 10 毫秒变 1 秒。DBA 需要快速判断哪些索引需要重建、哪些只需重组。本工具列出 sys.dm_db_index_physical_stats 的输出字段(avg_fragmentation_in_percent、page_count)以及官方建议阈值(>30% 重建,5%-30% 重组),直接套用查询模板生成脚本,省去翻 MSDN 文档的时间。

伍

自定义函数调试

开发在 SSMS 里写了一个标量函数,计算订单的「加权平均折扣」,但返回结果总是 NULL。调试时发现函数里用了 SELECT @var = col 的赋值方式,但未处理多行。本工具的函数语法速查里明确标注了「标量函数内 SELECT 赋值若返回多行会报错,应改用聚合函数或游标」,对照修改后结果正确。

第二节

使用指南

Getting Started

使用步骤

  1. 1在搜索框输入 T-SQL 关键词(如 `GETDATE`、`sys.tables`),下拉列表即时过滤匹配项
  2. 2从过滤结果中点击目标函数或视图名,右侧区域展示其完整语法、参数说明及返回值类型
  3. 3展开「示例」折叠面板,查看带注释的代码片段,可点击代码块右上角图标一键复制
  4. 4点击「相关对象」标签页,查看与该函数关联的系统视图、存储过程或常用查询模式

输入输出示例

输入输出说明
SELECT GETDATE()2025-01-15 14:30:22.123常规:最常用的日期函数,验证工具能否正确识别并返回当前服务器时间格式
SELECT DATEDIFF(day, '2025-01-01', '2025-01-15')14常规:日期差计算典型场景,验证DATEDIFF参数顺序(结束-开始)是否正确
SELECT LEN(' Hello ')9边界:LEN不计算尾部空格,但计算前导空格,此输入含前后空格,验证工具是否按T-SQL规范处理
SELECT CHARINDEX('abc', 'abcabc', 4)4边界:从指定位置开始搜索,验证CHARINDEX第三个参数(start_location)的偏移行为
SELECT SUBSTRING('SQL Server', 100, 5)''边界:起始位置超出字符串长度,应返回空字符串而非NULL或报错,验证越界处理
SELECT CAST('abc' AS int)转换失败:无法将值'abc'转换为数据类型int易错:类型转换失败时不同函数(CAST/TRY_CAST)行为不同,此处展示CAST的硬错误
SELECT NULLIF(0, 0)NULL易错:NULLIF在参数相等时返回NULL而非0,易与ISNULL混淆,验证逻辑
SELECT ROUND(2.5, 0)3.0易错:SQL Server的ROUND采用四舍五入(银行家舍入?),此处验证默认行为,注意与ROUND(2.5,0,1)截断的区别

常见错误对照

1.字符串拼接用 + 而非 CONCAT 或 +(T-SQL 上下文)

✗ 错误SELECT '单价: ' + 19.99
✓ 修复SELECT '单价: ' + CAST(19.99 AS VARCHAR(10))

T-SQL 中 + 拼接字符串时,若一侧为数值类型,不会自动隐式转换,报错 'Implicit conversion from data type numeric to varchar is not allowed'。必须显式 CAST 或使用 CONCAT 函数。

2.TOP 子句后漏括号,导致逻辑歧义

✗ 错误SELECT TOP 10 PERCENT * FROM Orders
✓ 修复SELECT TOP (10) PERCENT * FROM Orders

SQL Server 2008+ 要求 TOP 后跟表达式时必须加括号。不加括号虽可执行,但若后面跟变量或子查询(如 TOP @n)会报语法错误。规范写法始终加括号,避免维护时踩坑。

3.DATEPART 参数用字符串而非标准缩写

✗ 错误SELECT DATEPART('year', GETDATE())
✓ 修复SELECT DATEPART(YEAR, GETDATE())

DATEPART 的第一个参数是关键字(YEAR、MONTH、DAY),不是字符串。用字符串 'year' 虽在部分版本中通过隐式转换生效,但官方文档明确要求使用标识符,且未来版本可能废弃。

4.ORDER BY 中误用列别名做计算

✗ 错误SELECT ProductName, Price * Qty AS Total FROM Sales ORDER BY Total DESC
✓ 修复SELECT ProductName, Price * Qty AS Total FROM Sales ORDER BY Price * Qty DESC

SQL Server 中 ORDER BY 可以使用列别名,但若别名表达式涉及聚合或子查询,可能因执行顺序导致 'Invalid column name'。更安全的方式是重复表达式或使用列序号。

5.DATEDIFF 参数顺序搞反,得到负数

✗ 错误SELECT DATEDIFF(DAY, '2024-12-31', '2024-01-01')
✓ 修复SELECT DATEDIFF(DAY, '2024-01-01', '2024-12-31')

DATEDIFF 语法是 DATEDIFF(datepart, startdate, enddate),返回 enddate - startdate。参数顺序与直觉相反(先小后大),容易写反,导致结果负数或逻辑错误。

6.ISNULL 与 COALESCE 混用,类型优先级不同

✗ 错误SELECT ISNULL(NULL, '默认值')
✓ 修复SELECT COALESCE(NULL, '默认值')

ISNULL 会强制第二个参数类型与第一个一致,若类型不匹配可能隐式截断。COALESCE 是 ANSI 标准,返回第一个非空值且类型由参数列表决定,更可控。建议统一用 COALESCE。

7.字符串比较忽略排序规则,大小写敏感

✗ 错误WHERE Name = 'smith'
✓ 修复WHERE Name = 'smith' COLLATE Latin1_General_CI_AS

SQL Server 默认排序规则(如 Latin1_General_CI_AS)是大小写不敏感,但若数据库或列使用 CS(Case Sensitive)排序规则,'Smith' 和 'smith' 不等。显式指定 COLLATE 可避免环境差异。

8.GETDATE() 误用于日期筛选,忽略时间部分

✗ 错误WHERE OrderDate = GETDATE()
✓ 修复WHERE CAST(OrderDate AS DATE) = CAST(GETDATE() AS DATE)

GETDATE() 返回当前日期+时间,精确到毫秒。若 OrderDate 也含时间,等号匹配几乎永远不成立。正确做法是截断时间部分,或使用日期范围查询(>= 当天 00:00:00 AND < 次日 00:00:00)。

9.使用 NOLOCK 提示导致脏读

✗ 错误SELECT * FROM Orders WITH (NOLOCK)
✓ 修复SELECT * FROM Orders WITH (READUNCOMMITTED)

NOLOCK 是 READUNCOMMITTED 的别名,允许读取未提交数据,可能读到回滚后的脏数据。在一致性要求高的场景(如财务统计)应避免,改用 READ COMMITTED SNAPSHOT 或更高级隔离级别。

第三节

工作原理

How It Works

核心公式

DATEDIFF(day, start_date, end_date)

变量说明

  • day日期部分,如 year/month/day
  • start_date起始日期,datetime 类型
  • end_date结束日期,datetime 类型

示例

查询 2024-01-01 到 2024-12-31 的天数:DATEDIFF(day, '2024-01-01', '2024-12-31') = 365 天(2024 为闰年,但 DATEDIFF 按边界差值计算,结果为 365)。

输入 T-SQL 语句(SELECT / 函数 / 视图名)词法解析 & 校验(关键字 / 语法 / 参数)本地数据匹配(内置函数库 / 视图表)输出结果输入系统视图名(如 sys.objects)结构映射 & 字段说明(列名 / 类型 / 用途)输出结果另一入口
用户输入 本地处理 输出结果
第五节

常见问题

Q & A
问怎么查某个表有哪些字段和类型?+
答

用系统视图 `INFORMATION_SCHEMA.COLUMNS` 或 `sys.columns`。例如:`SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '你的表名'`。在速查工具的输入框直接粘贴这条 SQL 即可运行,结果会列出字段名、数据类型和长度。注意表名要加引号,且区分大小写取决于数据库排序规则。

问为什么我查出来的日期时间比实际多了 8 小时?+
答

这是时区对齐问题。SQL Server 的 `GETDATE()` 返回服务器本地时间,而 `GETUTCDATE()` 返回 UTC 时间。如果你的服务器在东八区,`GETDATE()` 会比 `GETUTCDATE()` 多 8 小时。速查工具结果区不自动转换时区,直接显示数据库返回的值。建议在处理跨时区数据时,统一用 `GETUTCDATE()` 存储,查询时用 `AT TIME ZONE` 转回目标时区。

问这个工具能查系统存储过程的参数吗?+
答

可以,通过 `sys.parameters` 视图。例如:`SELECT name, parameter_id, system_type_id, max_length FROM sys.parameters WHERE object_id = OBJECT_ID('sp_who')`。速查工具支持直接执行这类系统视图查询,返回结果包括参数名、类型和长度。注意 `sp_who` 是系统存储过程,需有相应权限才能查看其参数定义。

问为什么我写的 CASE 表达式一直报语法错?+
答

常见原因:1)缺少 `END` 关键字;2)`WHEN` 后的条件用了 `=` 而非 `IN` 或 `BETWEEN`;3)`ELSE` 分支的数据类型不匹配。例如 `CASE WHEN status = 1 THEN '启用' ELSE 0 END` 会报错,因为 '启用' 是字符串而 0 是整数。速查工具不会自动修正语法,但结果区的错误信息会直接提示行号和错误类型,根据提示定位即可。

问这个速查工具跟 SSMS 的查询编辑器有什么区别?+
答

SSMS 是完整的数据库管理工具,支持编辑表结构、备份还原、作业调度等。本速查工具专注 T-SQL 语法验证和系统视图查询,适合快速测试一段 SQL 或查某个函数的用法。它不连接你的数据库,所有查询在浏览器本地模拟执行(FE 实现),不涉及数据上传,适合在无法访问 SSMS 的环境(如客户现场、受限网络)下临时查语法。

问我输入了 SELECT 语句,为什么结果全是空?+
答

可能原因:1)表名或字段名写错,工具无法匹配到实际对象;2)查询条件 `WHERE` 过滤掉了所有行;3)你查询的是系统视图,但当前用户权限不足。速查工具基于内置的模拟数据运行,不连接真实数据库,因此结果为空通常表示语法正确但模拟数据中没有匹配记录。如果想验证真实数据,请将语句复制到 SSMS 或 Azure Data Studio 中执行。

问怎么用 PIVOT 把行转成列?+
答

PIVOT 语法:`SELECT ... FROM (源查询) AS SourceTable PIVOT (聚合函数(值列) FOR 行转列的依据列 IN (列名列表)) AS PivotTable`。例如按月统计销售额:`SELECT YEAR, [1] AS Jan, [2] AS Feb FROM (SELECT YEAR(OrderDate) AS YEAR, MONTH(OrderDate) AS MONTH, Amount FROM Sales) AS S PIVOT (SUM(Amount) FOR MONTH IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) AS P`。在速查工具中直接输入即可测试,注意 IN 列表中的列名必须与源查询中出现的值一致,否则报错。

问为什么我的字符串拼接用 + 号报错?+
答

SQL Server 中 `+` 号拼接字符串时,如果其中一个值为 `NULL`,整个结果会变成 `NULL`。例如 `'Hello' + NULL` 返回 NULL。解决办法:用 `CONCAT()` 函数,它会自动将 NULL 转为空字符串。速查工具支持 `CONCAT` 和 `CONCAT_WS`(带分隔符),建议在拼接多个字段时优先使用。另外注意数字和字符串拼接需显式转换,如 `CAST(id AS VARCHAR) + '号'`。

问这个工具能查 SQL Server 的版本信息吗?+
答

可以,用 `SELECT @@VERSION` 或 `SELECT SERVERPROPERTY('ProductVersion')`。不过本速查工具运行在浏览器端,不连接真实 SQL Server 实例,因此这些函数返回的是工具内置的模拟版本字符串(通常为 SQL Server 2019 的版本号),并非你实际服务器的版本。如需获取真实版本,请在 SSMS 或 sqlcmd 中执行。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

↑↓选择 ↵打开 ⌘+↵新窗口 esc关闭