SQL Server 命令速查
T-SQL / 函数 / 系统视图 · 点击复制
T-SQL / 函数 / 系统视图 · 点击复制
写 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 赋值若返回多行会报错,应改用聚合函数或游标」,对照修改后结果正确。
| 输入 | 输出 | 说明 |
|---|---|---|
| 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.99SELECT '单价: ' + 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 OrdersSELECT TOP (10) PERCENT * FROM OrdersSQL 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 DESCSELECT ProductName, Price * Qty AS Total FROM Sales ORDER BY Price * Qty DESCSQL 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_ASSQL 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 或更高级隔离级别。
DATEDIFF(day, start_date, end_date)
day日期部分,如 year/month/daystart_date起始日期,datetime 类型end_date结束日期,datetime 类型查询 2024-01-01 到 2024-12-31 的天数:DATEDIFF(day, '2024-01-01', '2024-12-31') = 365 天(2024 为闰年,但 DATEDIFF 按边界差值计算,结果为 365)。
用系统视图 `INFORMATION_SCHEMA.COLUMNS` 或 `sys.columns`。例如:`SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '你的表名'`。在速查工具的输入框直接粘贴这条 SQL 即可运行,结果会列出字段名、数据类型和长度。注意表名要加引号,且区分大小写取决于数据库排序规则。
这是时区对齐问题。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` 是系统存储过程,需有相应权限才能查看其参数定义。
常见原因:1)缺少 `END` 关键字;2)`WHEN` 后的条件用了 `=` 而非 `IN` 或 `BETWEEN`;3)`ELSE` 分支的数据类型不匹配。例如 `CASE WHEN status = 1 THEN '启用' ELSE 0 END` 会报错,因为 '启用' 是字符串而 0 是整数。速查工具不会自动修正语法,但结果区的错误信息会直接提示行号和错误类型,根据提示定位即可。
SSMS 是完整的数据库管理工具,支持编辑表结构、备份还原、作业调度等。本速查工具专注 T-SQL 语法验证和系统视图查询,适合快速测试一段 SQL 或查某个函数的用法。它不连接你的数据库,所有查询在浏览器本地模拟执行(FE 实现),不涉及数据上传,适合在无法访问 SSMS 的环境(如客户现场、受限网络)下临时查语法。
可能原因:1)表名或字段名写错,工具无法匹配到实际对象;2)查询条件 `WHERE` 过滤掉了所有行;3)你查询的是系统视图,但当前用户权限不足。速查工具基于内置的模拟数据运行,不连接真实数据库,因此结果为空通常表示语法正确但模拟数据中没有匹配记录。如果想验证真实数据,请将语句复制到 SSMS 或 Azure Data Studio 中执行。
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) + '号'`。
可以,用 `SELECT @@VERSION` 或 `SELECT SERVERPROPERTY('ProductVersion')`。不过本速查工具运行在浏览器端,不连接真实 SQL Server 实例,因此这些函数返回的是工具内置的模拟版本字符串(通常为 SQL Server 2019 的版本号),并非你实际服务器的版本。如需获取真实版本,请在 SSMS 或 sqlcmd 中执行。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。