如何在sqlcmd中垂直显示MS SQL查询结果?
模拟MySQL \G的垂直显示效果在sqlcmd里
我太懂这种烦恼了——sqlcmd默认的表格显示遇上长文本,终端自动换行后整个结果乱糟糟的,读起来眼睛都花。其实咱们可以通过几种方式实现类似MySQL \G的垂直显示效果,或者至少让输出更易读:
方法一:手动构造垂直输出(适合单条记录)
如果只是查询单条记录,直接把每个字段单独输出成一行就行,简单粗暴但有效。比如你原本的查询是:
SELECT UserID, UserName, Email, Bio FROM Users WHERE UserID = 123;
改成这样:
SET NOCOUNT ON; -- 去掉影响行数的提示 SELECT 'UserID: ' + CAST(UserID AS VARCHAR(10)) FROM Users WHERE UserID = 123 UNION ALL SELECT 'UserName: ' + UserName FROM Users WHERE UserID = 123 UNION ALL SELECT 'Email: ' + Email FROM Users WHERE UserID = 123 UNION ALL SELECT 'Bio: ' + Bio FROM Users WHERE UserID = 123;
输出就会变成:
UserID: 123 UserName: JohnDoe Email: john@example.com Bio: 这是一段很长很长的个人简介,再也不会被自动拆成好几行了!
方法二:动态SQL自动生成垂直输出(通用方案)
如果要查的表字段多,手动写太麻烦?用动态SQL自动生成垂直输出的语句就行,不管多少字段都能搞定:
DECLARE @TableName NVARCHAR(128) = 'Users'; -- 替换成你的表名 DECLARE @WhereClause NVARCHAR(MAX) = 'WHERE UserID = 123'; -- 替换成你的查询条件 DECLARE @SQL NVARCHAR(MAX) = ''; -- 拼接每个字段的输出语句 SELECT @SQL = @SQL + 'SELECT ''' + COLUMN_NAME + ': '' + CAST(' + COLUMN_NAME + ' AS NVARCHAR(MAX)) FROM ' + @TableName + ' ' + @WhereClause + ' UNION ALL ' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TableName; -- 去掉最后多余的UNION ALL SET @SQL = LEFT(@SQL, LEN(@SQL) - 10); -- 执行生成的SQL EXEC sp_executesql @SQL;
只要替换表名和查询条件,就能自动把所有字段转成垂直格式输出,完美模拟\G的效果。
方法三:调整sqlcmd窗口宽度(临时救急)
如果只是偶尔遇到换行问题,可以用-w参数设置sqlcmd的输出宽度,比如:
sqlcmd -S YourServer -d YourDB -w 200 -Q "SELECT * FROM Users WHERE UserID=123;"
-w 200表示把输出宽度设为200个字符,超过这个宽度才会换行。不过这个方法治标不治本,超长文本还是会折行,不如垂直显示直观。
方法四:输出到文件后查看
如果终端实在不好处理,把结果输出到文本文件再打开:
sqlcmd -S YourServer -d YourDB -o "query_results.txt" -Q "SELECT * FROM Users WHERE UserID=123;"
然后用记事本或者其他文本编辑器打开文件,调整窗口大小就能舒服阅读了。
这些方法里,我个人最常用的是动态SQL的方案,灵活又省心,基本能覆盖大部分场景。
内容的提问来源于stack exchange,提问作者kenorb
相关产品推荐
相关产品推荐

