全网最长的sql server巡检脚本分享(1000行)

一、说明:

此脚本基于2014进行编写的,sql server每个版本的函数基本都有变化,其他版本需要进行修改测试。大家可以根据官方的文章进行相应参数的修改。

官网地址:
https://learn.microsoft.com/zh-cn/previous-versions/sql/

二、脚本执行过程展示:

1、新建查询


2、复制脚本


3、点击执行
 


4、查看结果


我们可以看到执行成功了,结果栏是执行sql结果的展示,消息栏是执行的结果打印,当然也可以将结果进行另存留档。
 

图片


 

图片

图片

三、脚本内容:
 
  1. print '----------------------------'

  2. print ' 开始巡检 '

  3. print '----------------------------'

  4. print '1.查看数据库版本信息 '

  5. print'----------------------------'

  6. print '*********************************'

  7. SET NOCOUNT ON;

  8. use master

  9. go

  10. print ' '

  11. print @@version

  12. go

  13. print ' '

  14. print ' '

  15. select cast(serverproperty('productversion') as varchar(30)) as 产品版本号,

  16. cast(serverproperty('productlevel') as varchar(30)) as sp_level,

  17. cast(serverproperty('edition') as varchar(30)) as 版本

  18. go

  19. print '2.SQLSERVER 最大连接数 '

  20. print'----------------------------'

  21. print '*********************************'

  22. print ' '

  23. print @@max_connections

  24. go

  25. print '3.输出当前活跃的用户 '

  26. print'----------------------------'

  27. print '*********************************'

  28. SELECT * FROM sys.dm_exec_sessions WHERE is_user_process = 1;

  29. -- 关闭受影响的行数消息

  30. SET NOCOUNT ON;

  31. DECLARE @Result NVARCHAR(MAX) = ''

  32. DECLARE @session_id INT

  33. DECLARE @login_name NVARCHAR(128)

  34. DECLARE @host_name NVARCHAR(128)

  35. DECLARE @program_name NVARCHAR(128)

  36. DECLARE @status NVARCHAR(30)

  37. -- 游标遍历查询结果

  38. DECLARE session_cursor CURSOR FOR

  39. SELECT session_id, login_name, host_name, program_name, status

  40. FROM sys.dm_exec_sessions

  41. WHERE is_user_process = 1

  42. OPEN session_cursor

  43. FETCH NEXT FROM session_cursor INTO @session_id, @login_name, @host_name, @program_name, @status

  44. -- 打印列名作为标题行

  45. PRINT 'Session ID' + CHAR(9) + 'Login Name' + CHAR(9) + 'Host Name' + CHAR(9) + 'Program Name' + CHAR(9) + 'Status'

  46. WHILE @@FETCH_STATUS = 0

  47. BEGIN

  48. -- 将每列结果拼接成字符串

  49. SET @Result = CAST(@session_id AS NVARCHAR(10)) + CHAR(9) +

  50. @login_name + CHAR(9) +

  51. @host_name + CHAR(9) +

  52. @program_name + CHAR(9) +

  53. @status

  54. -- 打印结果

  55. PRINT @Result

  56. -- 获取下一条记录

  57. FETCH NEXT FROM session_cursor INTO @session_id, @login_name, @host_name, @program_name, @status

  58. END

  59. CLOSE session_cursor

  60. DEALLOCATE session_cursor

  61. -- 恢复默认行为(显示受影响的行数消息)

  62. SET NOCOUNT OFF;

  63. print '4.查看所有数据库名称及大小 '

  64. print'----------------------------'

  65. print '*********************************'

  66. exec sp_helpdb

  67. -- 关闭受影响的行数消息

  68. SET NOCOUNT ON;

  69. -- 创建临时表来捕获存储过程的输出

  70. CREATE TABLE #HelpDbResult2 (

  71. name NVARCHAR(128),

  72. db_size NVARCHAR(50),

  73. owner NVARCHAR(128),

  74. dbid SMALLINT,

  75. created DATETIME,

  76. status NVARCHAR(512),

  77. compatibility_level TINYINT

  78. );

  79. -- 将存储过程的输出插入到临时表

  80. INSERT INTO #HelpDbResult2

  81. EXEC sp_helpdb;

  82. DECLARE @name NVARCHAR(128)

  83. DECLARE @db_size NVARCHAR(50)

  84. DECLARE @owner NVARCHAR(128)

  85. DECLARE @dbid SMALLINT

  86. DECLARE @created DATETIME

  87. DECLARE @status1 NVARCHAR(512)

  88. DECLARE @compatibility_level TINYINT

  89. -- 游标遍历临时表中的结果

  90. DECLARE helpdb_cursor CURSOR FOR

  91. SELECT name, db_size, owner, dbid, created, status, compatibility_level

  92. FROM #HelpDbResult2;

  93. OPEN helpdb_cursor;

  94. FETCH NEXT FROM helpdb_cursor INTO @name, @db_size, @owner, @dbid, @created, @status1, @compatibility_level;

  95. -- 打印列名作为标题行

  96. PRINT 'Database Name' + CHAR(9) + 'Size' + CHAR(9) + 'Owner' + CHAR(9) + 'Database ID' + CHAR(9) + 'Created' + CHAR(9) + 'Status' + CHAR(9) + 'Compatibility Level'

  97. -- 打印每行数据

  98. WHILE @@FETCH_STATUS = 0

  99. BEGIN

  100. -- 将每列结果拼接成字符串

  101. PRINT @name + CHAR(9) + @db_size + CHAR(9) + @owner + CHAR(9) + CAST(@dbid AS NVARCHAR(10)) + CHAR(9) + CAST(@created AS NVARCHAR(20)) + CHAR(9) + @status + CHAR(9) + CAST(@compatibility_level AS NVARCHAR(3))

  102. -- 获取下一条记录

  103. FETCH NEXT FROM helpdb_cursor INTO @name, @db_size, @owner, @dbid, @created, @status1, @compatibility_level;

  104. END

  105. CLOSE helpdb_cursor;

  106. DEALLOCATE helpdb_cursor;

  107. -- 删除临时表

  108. DROP TABLE #HelpDbResult2;

  109. -- 恢复默认行为(显示受影响的行数消息)

  110. SET NOCOUNT OFF;

  111. print '5.查看数据库所在机器的操作系统参数 '

  112. print'----------------------------'

  113. print '*********************************'

  114. -- 关闭受影响的行数消息

  115. SET NOCOUNT ON;

  116. exec master..xp_msver

  117. -- 创建临时表来捕获存储过程的输出结果

  118. CREATE TABLE #XpMsverResult (

  119. idx INT,

  120. name NVARCHAR(128),

  121. internal_value INT,

  122. character_value NVARCHAR(256)

  123. );

  124. -- 将存储过程的输出插入到临时表中

  125. INSERT INTO #XpMsverResult (idx, name, internal_value, character_value)

  126. EXEC master..xp_msver;

  127. DECLARE @idx INT

  128. DECLARE @name2 NVARCHAR(128)

  129. DECLARE @internal_value INT

  130. DECLARE @character_value NVARCHAR(256)

  131. DECLARE @Result4 NVARCHAR(MAX)

  132. -- 游标遍历临时表中的结果

  133. DECLARE xpmsver_cursor CURSOR FOR

  134. SELECT idx, name, internal_value, character_value

  135. FROM #XpMsverResult;

  136. OPEN xpmsver_cursor;

  137. FETCH NEXT FROM xpmsver_cursor INTO @idx, @name2, @internal_value, @character_value;

  138. -- 打印列名作为标题行

  139. PRINT 'Idx' + REPLICATE(' ', 6 - LEN('Idx')) +

  140. 'Name' + REPLICATE(' ', 30 - LEN('Name')) +

  141. 'Internal Value' + REPLICATE(' ', 20 - LEN('Internal Value')) +

  142. 'Character Value'

  143. -- 打印每行数据

  144. WHILE @@FETCH_STATUS = 0

  145. BEGIN

  146. -- 将每列结果拼接成字符串

  147. SET @Result4 =

  148. CAST(@idx AS NVARCHAR(10)) + REPLICATE(' ', 6 - LEN(CAST(@idx AS NVARCHAR(10)))) +

  149. ISNULL(@name2, '') + REPLICATE(' ', 30 - LEN(ISNULL(@name2, ''))) +

  150. ISNULL(CAST(@internal_value AS NVARCHAR(10)), '') + REPLICATE(' ', 20 - LEN(ISNULL(CAST(@internal_value AS NVARCHAR(10)), ''))) +

  151. ISNULL(@character_value, '')

  152. -- 打印结果

  153. PRINT @Result

  154. -- 获取下一条记录

  155. FETCH NEXT FROM xpmsver_cursor INTO @idx, @name2, @internal_value, @character_value;

  156. END

  157. CLOSE xpmsver_cursor;

  158. DEALLOCATE xpmsver_cursor;

  159. -- 删除临时表

  160. DROP TABLE #XpMsverResult;

  161. -- 恢复默认行为(显示受影响的行数消息)

  162. SET NOCOUNT OFF;

  163. print '6.查看数据库启动的参数 '

  164. print'----------------------------'

  165. print '*********************************'

  166. -- 关闭受影响的行数消息

  167. SET NOCOUNT ON;

  168. SELECT

  169. name,value,value_in_use

  170. FROM

  171. sys.configurations

  172. WHERE

  173. configuration_id IN (

  174. SELECT

  175. configuration_id

  176. FROM

  177. sys.configurations

  178. WHERE

  179. name LIKE '%recovery%' OR

  180. name LIKE '%memory%' OR

  181. name LIKE '%max degree of parallelism%' OR

  182. name LIKE '%cost threshold for parallelism%'

  183. )

  184. order by configuration_id

  185. Go

  186. -- 创建临时表来捕获查询结果

  187. CREATE TABLE #ConfigurationsResult (

  188. name NVARCHAR(128),

  189. value SQL_VARIANT,

  190. value_in_use SQL_VARIANT

  191. );

  192. -- 将查询结果插入到临时表中

  193. INSERT INTO #ConfigurationsResult (name, value, value_in_use)

  194. SELECT

  195. name, value, value_in_use

  196. FROM

  197. sys.configurations

  198. WHERE

  199. configuration_id IN (

  200. SELECT

  201. configuration_id

  202. FROM

  203. sys.configurations

  204. WHERE

  205. name LIKE '%recovery%' OR

  206. name LIKE '%memory%' OR

  207. name LIKE '%max degree of parallelism%' OR

  208. name LIKE '%cost threshold for parallelism%'

  209. )

  210. ORDER BY configuration_id;

  211. DECLARE @name3 NVARCHAR(128)

  212. DECLARE @value5 SQL_VARIANT

  213. DECLARE @value_in_use SQL_VARIANT

  214. DECLARE @Result5 NVARCHAR(MAX)

  215. -- 游标遍历临时表中的结果

  216. DECLARE configurations_cursor CURSOR FOR

  217. SELECT name, value, value_in_use

  218. FROM #ConfigurationsResult;

  219. OPEN configurations_cursor;

  220. FETCH NEXT FROM configurations_cursor INTO @name3, @value5, @value_in_use;

  221. -- 打印列名作为标题行

  222. PRINT 'Name' + REPLICATE(' ', 50 - LEN('Name')) +

  223. 'Value' + REPLICATE(' ', 20 - LEN('Value')) +

  224. 'Value In Use'

  225. -- 打印每行数据

  226. WHILE @@FETCH_STATUS = 0

  227. BEGIN

  228. -- 将每列结果拼接成字符串

  229. SET @Result5 =

  230. ISNULL(@name3, '') + REPLICATE(' ', 50 - LEN(ISNULL(@name3, ''))) +

  231. CAST(ISNULL(@value5, '') AS NVARCHAR) + REPLICATE(' ', 20 - LEN(CAST(ISNULL(@value5, '') AS NVARCHAR))) +

  232. CAST(ISNULL(@value_in_use, '') AS NVARCHAR)

  233. -- 打印结果

  234. PRINT @Result5

  235. -- 获取下一条记录

  236. FETCH NEXT FROM configurations_cursor INTO @name3, @value5, @value_in_use;

  237. END

  238. CLOSE configurations_cursor;

  239. DEALLOCATE configurations_cursor;

  240. -- 删除临时表

  241. DROP TABLE #ConfigurationsResult;

  242. -- 恢复默认行为(显示受影响的行数消息)

  243. SET NOCOUNT OFF;

  244. print '7.查看数据库启动时间 '

  245. print'----------------------------'

  246. print '*********************************'

  247. -- 关闭受影响的行数消息

  248. SET NOCOUNT ON;

  249. select convert(varchar(30),login_time,120)

  250. from master..sysprocesses where spid=1

  251. -- 创建临时表来捕获查询结果

  252. CREATE TABLE #SysProcessesResult (

  253. login_time VARCHAR(30)

  254. );

  255. -- 将查询结果插入到临时表中

  256. INSERT INTO #SysProcessesResult (login_time)

  257. SELECT convert(varchar(30), login_time, 120)

  258. FROM master..sysprocesses

  259. WHERE spid = 1;

  260. DECLARE @login_time VARCHAR(30)

  261. DECLARE @Result3 NVARCHAR(MAX)

  262. -- 游标遍历临时表中的结果

  263. DECLARE sysprocesses_cursor CURSOR FOR

  264. SELECT login_time

  265. FROM #SysProcessesResult;

  266. OPEN sysprocesses_cursor;

  267. FETCH NEXT FROM sysprocesses_cursor INTO @login_time;

  268. -- 打印列名作为标题行

  269. PRINT 'Login Time' + REPLICATE(' ', 30 - LEN('Login Time'))

  270. -- 打印每行数据

  271. WHILE @@FETCH_STATUS = 0

  272. BEGIN

  273. -- 将每列结果拼接成字符串

  274. SET @Result3 = ISNULL(@login_time, '') + REPLICATE(' ', 30 - LEN(ISNULL(@login_time, '')))

  275. -- 打印结果

  276. PRINT @Result3

  277. -- 获取下一条记录

  278. FETCH NEXT FROM sysprocesses_cursor INTO @login_time;

  279. END

  280. CLOSE sysprocesses_cursor;

  281. DEALLOCATE sysprocesses_cursor;

  282. -- 删除临时表

  283. DROP TABLE #SysProcessesResult;

  284. -- 恢复默认行为(显示受影响的行数消息)

  285. SET NOCOUNT OFF;

  286. print '8.查看数据库服务器名 '

  287. print'----------------------------'

  288. print '*********************************'

  289. -- 关闭受影响的行数消息

  290. SET NOCOUNT ON;

  291. select 'Server Name:'+ltrim(@@servername)

  292. -- 创建临时表来捕获查询结果

  293. CREATE TABLE #ServerNameResult3 (

  294. ServerInfo2 NVARCHAR(128)

  295. );

  296. -- 将查询结果插入到临时表中

  297. INSERT INTO #ServerNameResult3 (ServerInfo2)

  298. SELECT 'Server Name:' + LTRIM(@@servername);

  299. DECLARE @ServerInfo2 NVARCHAR(128)

  300. DECLARE @Result6 NVARCHAR(MAX)

  301. -- 游标遍历临时表中的结果

  302. DECLARE servername_cursor CURSOR FOR

  303. SELECT ServerInfo2

  304. FROM #ServerNameResult3;

  305. OPEN servername_cursor;

  306. FETCH NEXT FROM servername_cursor INTO @ServerInfo2;

  307. -- 打印列名作为标题行

  308. PRINT 'Server Information'

  309. -- 打印每行数据

  310. WHILE @@FETCH_STATUS = 0

  311. BEGIN

  312. -- 将每列结果拼接成字符串并打印

  313. PRINT ISNULL(@ServerInfo2, '')

  314. -- 获取下一条记录

  315. FETCH NEXT FROM servername_cursor INTO @ServerInfo2;

  316. END

  317. CLOSE servername_cursor;

  318. DEALLOCATE servername_cursor;

  319. -- 删除临时表

  320. DROP TABLE #ServerNameResult3;

  321. -- 恢复默认行为(显示受影响的行数消息)

  322. SET NOCOUNT OFF;

  323. print '9.查看数据库实例名 '

  324. print'----------------------------'

  325. print '*********************************'

  326. -- 关闭受影响的行数消息

  327. SET NOCOUNT ON;

  328. select 'Instance:'+ltrim(@@servicename)

  329. -- 创建临时表来捕获查询结果

  330. CREATE TABLE #InstanceResult (

  331. InstanceInfo NVARCHAR(128)

  332. );

  333. -- 将查询结果插入到临时表中

  334. INSERT INTO #InstanceResult (InstanceInfo)

  335. SELECT 'Instance:' + LTRIM(@@servicename);

  336. DECLARE @InstanceInfo NVARCHAR(128)

  337. DECLARE @Result7 NVARCHAR(MAX)

  338. -- 游标遍历临时表中的结果

  339. DECLARE instance_cursor CURSOR FOR

  340. SELECT InstanceInfo

  341. FROM #InstanceResult;

  342. OPEN instance_cursor;

  343. FETCH NEXT FROM instance_cursor INTO @InstanceInfo;

  344. -- 打印列名作为标题行

  345. PRINT 'Instance Information'

  346. -- 打印每行数据

  347. WHILE @@FETCH_STATUS = 0

  348. BEGIN

  349. -- 拼接字符串并打印结果

  350. PRINT ISNULL(@InstanceInfo, '')

  351. -- 获取下一条记录

  352. FETCH NEXT FROM instance_cursor INTO @InstanceInfo;

  353. END

  354. CLOSE instance_cursor;

  355. DEALLOCATE instance_cursor;

  356. -- 删除临时表

  357. DROP TABLE #InstanceResult;

  358. -- 恢复默认行为(显示受影响的行数消息)

  359. SET NOCOUNT OFF;

  360. print '10.查看数据库磁盘空间信息 '

  361. print'----------------------------'

  362. print '*********************************'

  363. -- 关闭受影响的行数消息

  364. SET NOCOUNT ON;

  365. EXEC master.dbo.xp_fixeddrives

  366. -- 步骤1: 创建一个用于存储 xp_fixeddrives 结果的临时表

  367. CREATE TABLE #FixedDrives (

  368. Drive CHAR(1),

  369. FreeSpaceMB INT

  370. );

  371. INSERT INTO #FixedDrives (Drive, FreeSpaceMB)

  372. EXEC master.dbo.xp_fixeddrives;

  373. DECLARE @Drive CHAR(1);

  374. DECLARE @FreeSpaceMB INT;

  375. DECLARE @ResultString NVARCHAR(MAX) = 'Drive | Free Space (MB)' + CHAR(13) + CHAR(10) + '-------------------------';

  376. DECLARE drive_cursor CURSOR FOR

  377. SELECT Drive, FreeSpaceMB FROM #FixedDrives;

  378. OPEN drive_cursor;

  379. FETCH NEXT FROM drive_cursor INTO @Drive, @FreeSpaceMB;

  380. WHILE @@FETCH_STATUS = 0

  381. BEGIN

  382. SET @ResultString = @ResultString + CHAR(13) + CHAR(10) + @Drive + ' | ' + CAST(@FreeSpaceMB AS NVARCHAR(50));

  383. FETCH NEXT FROM drive_cursor INTO @Drive, @FreeSpaceMB;

  384. END

  385. CLOSE drive_cursor;

  386. DEALLOCATE drive_cursor;

  387. -- 打印结果字符串

  388. PRINT @ResultString;

  389. DROP TABLE #FixedDrives;

  390. SET NOCOUNT OFF;

  391. print '11.日志文件大小及使用情况 '

  392. print'----------------------------'

  393. print '*********************************'

  394. SET NOCOUNT ON;

  395. dbcc sqlperf(logspace)

  396. -- 步骤: 创建一个用于存储 DBCC SQLPERF(logspace) 结果的临时表

  397. CREATE TABLE #LogSpace (

  398. DatabaseName VARCHAR(128),

  399. LogSizeMB FLOAT,

  400. LogSpaceUsedPct FLOAT,

  401. Status INT

  402. );

  403. -- 打印正在执行的脚本

  404. -- 步骤: 将 DBCC SQLPERF(logspace) 的结果插入到临时表中

  405. INSERT INTO #LogSpace (DatabaseName, LogSizeMB, LogSpaceUsedPct, Status)

  406. EXEC ('DBCC SQLPERF(logspace) WITH NO_INFOMSGS');

  407. -- 步骤: 查询并生成结果字符串

  408. DECLARE @DatabaseName VARCHAR(128);

  409. DECLARE @LogSizeMB FLOAT;

  410. DECLARE @LogSpaceUsedPct FLOAT;

  411. DECLARE @Status INT;

  412. DECLARE @ResultString1 NVARCHAR(MAX) = 'DatabaseName | LogSizeMB | LogSpaceUsedPct | Status' + CHAR(13) + CHAR(10) + '---------------------------------------------------';

  413. DECLARE logspace_cursor CURSOR FOR

  414. SELECT DatabaseName, LogSizeMB, LogSpaceUsedPct, Status FROM #LogSpace;

  415. OPEN logspace_cursor;

  416. FETCH NEXT FROM logspace_cursor INTO @DatabaseName, @LogSizeMB, @LogSpaceUsedPct, @Status;

  417. WHILE @@FETCH_STATUS = 0

  418. BEGIN

  419. SET @ResultString = @ResultString1 + CHAR(13) + CHAR(10) + @DatabaseName + ' | ' + CAST(@LogSizeMB AS NVARCHAR(50)) + ' | ' + CAST(@LogSpaceUsedPct AS NVARCHAR(50)) + ' | ' + CAST(@Status AS NVARCHAR(50));

  420. FETCH NEXT FROM logspace_cursor INTO @DatabaseName, @LogSizeMB, @LogSpaceUsedPct, @Status;

  421. END

  422. CLOSE logspace_cursor;

  423. DEALLOCATE logspace_cursor;

  424. -- 打印结果字符串

  425. PRINT @ResultString;

  426. -- 步骤: 删除临时表

  427. DROP TABLE #LogSpace;

  428. SET NOCOUNT OFF;

  429. print '12.表的磁盘空间使用信息 '

  430. print'----------------------------'

  431. print '*********************************'

  432. SET NOCOUNT ON;

  433. -- 打印正在执行的脚本

  434. PRINT 'Executing: SELECT @@total_read [读取磁盘次数], @@total_write [写入磁盘次数], @@total_errors [磁盘写入错误数], GETDATE() [当前时间]';

  435. -- 步骤1: 创建一个用于存储查询结果的临时表

  436. CREATE TABLE #DiskStats (

  437. TotalRead INT,

  438. TotalWrite INT,

  439. TotalErrors INT,

  440. CurrentTime DATETIME

  441. );

  442. -- 步骤2: 执行查询并将结果插入到临时表中

  443. INSERT INTO #DiskStats (TotalRead, TotalWrite, TotalErrors, CurrentTime)

  444. SELECT @@total_read, @@total_write, @@total_errors, GETDATE();

  445. -- 步骤3: 查询并生成结果字符串

  446. DECLARE @TotalRead INT;

  447. DECLARE @TotalWrite INT;

  448. DECLARE @TotalErrors INT;

  449. DECLARE @CurrentTime DATETIME;

  450. DECLARE @ResultString4 NVARCHAR(MAX);

  451. DECLARE diskstats_cursor CURSOR FOR

  452. SELECT TotalRead, TotalWrite, TotalErrors, CurrentTime FROM #DiskStats;

  453. OPEN diskstats_cursor;

  454. FETCH NEXT FROM diskstats_cursor INTO @TotalRead, @TotalWrite, @TotalErrors, @CurrentTime;

  455. WHILE @@FETCH_STATUS = 0

  456. BEGIN

  457. -- 初始化结果字符串

  458. SET @ResultString4 = '读取磁盘次数 | 写入磁盘次数 | 磁盘写入错误数 | 当前时间' + CHAR(13) + CHAR(10) + '---------------------------------------------------' + CHAR(13) + CHAR(10);

  459. -- 拼接结果字符串

  460. SET @ResultString4 = @ResultString4 + CAST(@TotalRead AS NVARCHAR(50)) + ' | ' + CAST(@TotalWrite AS NVARCHAR(50)) + ' | ' + CAST(@TotalErrors AS NVARCHAR(50)) + ' | ' + CAST(@CurrentTime AS NVARCHAR(50));

  461. FETCH NEXT FROM diskstats_cursor INTO @TotalRead, @TotalWrite, @TotalErrors, @CurrentTime;

  462. END

  463. CLOSE diskstats_cursor;

  464. DEALLOCATE diskstats_cursor;

  465. -- 打印结果字符串

  466. PRINT @ResultString4;

  467. -- 步骤4: 删除临时表

  468. DROP TABLE #DiskStats;

  469. SET NOCOUNT OFF;

  470. print '13.获取I/O工作情况 '

  471. print'----------------------------'

  472. print '*********************************'

  473. SET NOCOUNT ON;

  474. select * from sys.dm_os_wait_stats

  475. -- 创建用于存储查询结果的临时表

  476. CREATE TABLE #WaitStats (

  477. wait_type NVARCHAR(60),

  478. waiting_tasks_count BIGINT,

  479. wait_time_ms BIGINT,

  480. max_wait_time_ms BIGINT,

  481. signal_wait_time_ms BIGINT

  482. );

  483. -- 执行查询并将结果插入到临时表中

  484. INSERT INTO #WaitStats (wait_type, waiting_tasks_count, wait_time_ms, max_wait_time_ms, signal_wait_time_ms)

  485. SELECT wait_type, waiting_tasks_count, wait_time_ms, max_wait_time_ms, signal_wait_time_ms

  486. FROM sys.dm_os_wait_stats;

  487. -- 声明变量用于存储每列的数据

  488. DECLARE @wait_type NVARCHAR(60);

  489. DECLARE @waiting_tasks_count BIGINT;

  490. DECLARE @wait_time_ms BIGINT;

  491. DECLARE @max_wait_time_ms BIGINT;

  492. DECLARE @signal_wait_time_ms BIGINT;

  493. DECLARE @ResultString6 NVARCHAR(MAX);

  494. -- 初始化结果字符串的标题

  495. SET @ResultString6 = 'Wait Stats:' + CHAR(13) + CHAR(10) +

  496. 'wait_type | waiting_tasks_count | wait_time_ms | max_wait_time_ms | signal_wait_time_ms' + CHAR(13) + CHAR(10) +

  497. '-------------------------------------------------------------------------------';

  498. -- 声明游标

  499. DECLARE waitstats_cursor CURSOR FOR

  500. SELECT wait_type, waiting_tasks_count, wait_time_ms, max_wait_time_ms, signal_wait_time_ms FROM #WaitStats;

  501. -- 打开游标

  502. OPEN waitstats_cursor;

  503. -- 获取游标中的每一行数据并拼接到结果字符串中

  504. FETCH NEXT FROM waitstats_cursor INTO @wait_type, @waiting_tasks_count, @wait_time_ms, @max_wait_time_ms, @signal_wait_time_ms;

  505. WHILE @@FETCH_STATUS = 0

  506. BEGIN

  507. SET @ResultString6 = @ResultString + CHAR(13) + CHAR(10) +

  508. @wait_type + ' | ' +

  509. CAST(@waiting_tasks_count AS NVARCHAR(50)) + ' | ' +

  510. CAST(@wait_time_ms AS NVARCHAR(50)) + ' | ' +

  511. CAST(@max_wait_time_ms AS NVARCHAR(50)) + ' | ' +

  512. CAST(@signal_wait_time_ms AS NVARCHAR(50));

  513. FETCH NEXT FROM waitstats_cursor INTO @wait_type, @waiting_tasks_count, @wait_time_ms, @max_wait_time_ms, @signal_wait_time_ms;

  514. END

  515. -- 关闭游标

  516. CLOSE waitstats_cursor;

  517. DEALLOCATE waitstats_cursor;

  518. -- 打印结果字符串

  519. PRINT @ResultString;

  520. -- 删除临时表

  521. DROP TABLE #WaitStats;

  522. select top 10 *, (s.total_logical_reads / s.execution_count) as avglogicalreads from sys.dm_exec_query_stats s

  523. cross apply sys.dm_exec_sql_text(s.sql_handle)

  524. order by avglogicalreads desc

  525. select top 10 *, (s.total_logical_writes / s.execution_count) as avglogicalwrites from sys.dm_exec_query_stats s

  526. cross apply sys.dm_exec_sql_text(s.sql_handle)

  527. order by avglogicalwrites desc

  528. select * from sys.dm_os_waiting_tasks

  529. SET NOCOUNT ON;

  530. -- 查询 sys.dm_os_waiting_tasks 并存储在临时表中

  531. DECLARE @TempTable TABLE (

  532. session_id INT,

  533. exec_context_id INT,

  534. wait_duration_ms BIGINT,

  535. wait_type NVARCHAR(60),

  536. blocking_task_address VARBINARY(8),

  537. blocking_session_id INT,

  538. resource_description NVARCHAR(256)

  539. );

  540. -- 插入查询结果到临时表中

  541. INSERT INTO @TempTable

  542. SELECT

  543. session_id,

  544. exec_context_id,

  545. wait_duration_ms,

  546. wait_type,

  547. blocking_task_address,

  548. blocking_session_id,

  549. resource_description

  550. FROM sys.dm_os_waiting_tasks;

  551. -- 声明变量来存储每行的结果

  552. DECLARE @session_id NVARCHAR(MAX);

  553. DECLARE @exec_context_id NVARCHAR(MAX);

  554. DECLARE @wait_duration_ms NVARCHAR(MAX);

  555. DECLARE @wait_type2 NVARCHAR(MAX);

  556. DECLARE @blocking_task_address NVARCHAR(MAX);

  557. DECLARE @blocking_session_id NVARCHAR(MAX);

  558. DECLARE @resource_description NVARCHAR(MAX);

  559. -- 游标遍历临时表

  560. DECLARE cur CURSOR FOR

  561. SELECT

  562. CAST(session_id AS NVARCHAR),

  563. CAST(exec_context_id AS NVARCHAR),

  564. CAST(wait_duration_ms AS NVARCHAR),

  565. wait_type,

  566. CAST(blocking_task_address AS NVARCHAR(MAX)),

  567. CAST(blocking_session_id AS NVARCHAR),

  568. resource_description

  569. FROM @TempTable;

  570. OPEN cur;

  571. FETCH NEXT FROM cur INTO @session_id, @exec_context_id, @wait_duration_ms, @wait_type2, @blocking_task_address, @blocking_session_id, @resource_description;

  572. WHILE @@FETCH_STATUS = 0

  573. BEGIN

  574. -- 格式化并打印每一行的结果

  575. PRINT 'Session ID: ' + ISNULL(@session_id, '') + ' | ' +

  576. 'Exec Context ID: ' + ISNULL(@exec_context_id, '') + ' | ' +

  577. 'Wait Duration (ms): ' + ISNULL(@wait_duration_ms, '') + ' | ' +

  578. 'Wait Type: ' + ISNULL(@wait_type2, '') + ' | ' +

  579. 'Blocking Task Address: ' + ISNULL(@blocking_task_address, '') + ' | ' +

  580. 'Blocking Session ID: ' + ISNULL(@blocking_session_id, '') + ' | ' +

  581. 'Resource Description: ' + ISNULL(@resource_description, '');

  582. PRINT '--------------------------------------------';

  583. FETCH NEXT FROM cur INTO @session_id, @exec_context_id, @wait_duration_ms, @wait_type2, @blocking_task_address, @blocking_session_id, @resource_description;

  584. END

  585. CLOSE cur;

  586. DEALLOCATE cur;

  587. SET NOCOUNT OFF;

  588. print '14.查看CPU活动及工作情况 '

  589. print'----------------------------'

  590. print '*********************************'

  591. SET NOCOUNT ON;

  592. select

  593. @@cpu_busy,

  594. @@timeticks [每个时钟周期对应的微秒数],

  595. @@cpu_busy*cast(@@timeticks as float)/1000 [CPU工作时间(秒)],

  596. @@idle*cast(@@timeticks as float)/1000 [CPU空闲时间(秒)],

  597. getdate() [当前时间]

  598. SET NOCOUNT ON;

  599. -- 声明变量来存储查询结果

  600. DECLARE @cpu_busy INT;

  601. DECLARE @timeticks INT;

  602. DECLARE @cpu_busy_sec FLOAT;

  603. DECLARE @cpu_idle_sec FLOAT;

  604. DECLARE @current_time DATETIME;

  605. -- 获取查询结果

  606. SELECT

  607. @cpu_busy = @@cpu_busy,

  608. @timeticks = @@timeticks,

  609. @cpu_busy_sec = @@cpu_busy * CAST(@timeticks AS FLOAT) / 1000,

  610. @cpu_idle_sec = @@idle * CAST(@timeticks AS FLOAT) / 1000,

  611. @current_time = GETDATE();

  612. -- 格式化并打印结果

  613. PRINT 'CPU Busy: ' + CAST(@cpu_busy AS NVARCHAR);

  614. PRINT 'Timeticks (us/clock tick): ' + CAST(@timeticks AS NVARCHAR);

  615. PRINT 'CPU Busy Time (s): ' + CAST(@cpu_busy_sec AS NVARCHAR);

  616. PRINT 'CPU Idle Time (s): ' + CAST(@cpu_idle_sec AS NVARCHAR);

  617. PRINT 'Current Time: ' + CAST(@current_time AS NVARCHAR);

  618. PRINT '-----------------------------------------';

  619. -- 美观的多行输出

  620. DECLARE @result NVARCHAR(MAX);

  621. SET @result =

  622. 'CPU Busy: ' + CAST(@cpu_busy AS NVARCHAR) + CHAR(13) + CHAR(10) +

  623. 'Timeticks (us/clock tick): ' + CAST(@timeticks AS NVARCHAR) + CHAR(13) + CHAR(10) +

  624. 'CPU Busy Time (s): ' + CAST(@cpu_busy_sec AS NVARCHAR) + CHAR(13) + CHAR(10) +

  625. 'CPU Idle Time (s): ' + CAST(@cpu_idle_sec AS NVARCHAR) + CHAR(13) + CHAR(10) +

  626. 'Current Time: ' + CAST(@current_time AS NVARCHAR);

  627. PRINT @result;

  628. SET NOCOUNT OFF;

  629. print '15.检查锁与等待 '

  630. print'----------------------------'

  631. print '*********************************'

  632. SET NOCOUNT ON;

  633. exec sp_lock

  634. Go

  635. SET NOCOUNT ON;

  636. -- 创建临时表来存储 sp_lock 的结果

  637. CREATE TABLE #LockInfo (

  638. spid INT,

  639. dbid INT,

  640. ObjId BIGINT,

  641. IndId INT,

  642. Type NVARCHAR(4),

  643. Resource NVARCHAR(32),

  644. Mode NVARCHAR(8),

  645. Status NVARCHAR(8)

  646. );

  647. -- 插入 sp_lock 的结果到临时表中

  648. INSERT INTO #LockInfo

  649. EXEC sp_lock;

  650. -- 声明变量来存储每一行的结果

  651. DECLARE @spid NVARCHAR(10);

  652. DECLARE @dbid NVARCHAR(10);

  653. DECLARE @ObjId NVARCHAR(20);

  654. DECLARE @IndId NVARCHAR(10);

  655. DECLARE @Type NVARCHAR(4);

  656. DECLARE @Resource NVARCHAR(32);

  657. DECLARE @Mode NVARCHAR(8);

  658. DECLARE @Status NVARCHAR(8);

  659. DECLARE @result NVARCHAR(MAX);

  660. -- 游标遍历临时表

  661. DECLARE cur CURSOR FOR

  662. SELECT

  663. CAST(spid AS NVARCHAR),

  664. CAST(dbid AS NVARCHAR),

  665. CAST(ObjId AS NVARCHAR),

  666. CAST(IndId AS NVARCHAR),

  667. Type,

  668. Resource,

  669. Mode,

  670. Status

  671. FROM #LockInfo;

  672. OPEN cur;

  673. FETCH NEXT FROM cur INTO @spid, @dbid, @ObjId, @IndId, @Type, @Resource, @Mode, @Status;

  674. WHILE @@FETCH_STATUS = 0

  675. BEGIN

  676. -- 格式化并打印每一行的结果

  677. SET @result = 'SPID: ' + @spid + ', ' +

  678. 'DBID: ' + @dbid + ', ' +

  679. 'ObjId: ' + @ObjId + ', ' +

  680. 'IndId: ' + @IndId + ', ' +

  681. 'Type: ' + @Type + ', ' +

  682. 'Resource: ' + @Resource + ', ' +

  683. 'Mode: ' + @Mode + ', ' +

  684. 'Status: ' + @Status;

  685. PRINT @result;

  686. FETCH NEXT FROM cur INTO @spid, @dbid, @ObjId, @IndId, @Type, @Resource, @Mode, @Status;

  687. END

  688. CLOSE cur;

  689. DEALLOCATE cur;

  690. -- 删除临时表

  691. DROP TABLE #LockInfo;

  692. SET NOCOUNT OFF;

  693. print '16.检查死锁 '

  694. print'----------------------------'

  695. print '*********************************'

  696. SET NOCOUNT ON;

  697. exec sp_who2

  698. SET NOCOUNT ON;

  699. -- 创建用于存储 sp_who2 结果的临时表

  700. CREATE TABLE #Who2 (

  701. SPID INT,

  702. Status NVARCHAR(255),

  703. Login NVARCHAR(255),

  704. HostName NVARCHAR(255),

  705. BlkBy NVARCHAR(50),

  706. DBName NVARCHAR(255),

  707. Command NVARCHAR(255),

  708. CPUTime INT,

  709. DiskIO INT,

  710. LastBatch NVARCHAR(255),

  711. ProgramName NVARCHAR(255),

  712. SPID2 INT, -- This is for the SPID in sp_who2 output

  713. RequestID INT

  714. );

  715. -- 将 sp_who2 的结果插入到临时表中

  716. INSERT INTO #Who2 (SPID, Status, Login, HostName, BlkBy, DBName, Command, CPUTime, DiskIO, LastBatch, ProgramName, SPID2, RequestID)

  717. EXEC sp_who2;

  718. -- 声明变量来存储每一行的结果

  719. DECLARE @SPID1 NVARCHAR(10);

  720. DECLARE @Status11 NVARCHAR(255);

  721. DECLARE @Login NVARCHAR(255);

  722. DECLARE @HostName NVARCHAR(255);

  723. DECLARE @BlkBy NVARCHAR(50);

  724. DECLARE @DBName NVARCHAR(255);

  725. DECLARE @Command NVARCHAR(255);

  726. DECLARE @CPUTime NVARCHAR(10);

  727. DECLARE @DiskIO NVARCHAR(10);

  728. DECLARE @LastBatch NVARCHAR(255);

  729. DECLARE @ProgramName NVARCHAR(255);

  730. DECLARE @SPID2 NVARCHAR(10);

  731. DECLARE @RequestID NVARCHAR(10);

  732. DECLARE @result111 NVARCHAR(MAX);

  733. -- 游标遍历临时表

  734. DECLARE cur CURSOR FOR

  735. SELECT

  736. CAST(SPID AS NVARCHAR),

  737. Status,

  738. Login,

  739. HostName,

  740. BlkBy,

  741. DBName,

  742. Command,

  743. CAST(CPUTime AS NVARCHAR),

  744. CAST(DiskIO AS NVARCHAR),

  745. LastBatch,

  746. ProgramName,

  747. CAST(SPID2 AS NVARCHAR),

  748. CAST(RequestID AS NVARCHAR)

  749. FROM #Who2;

  750. OPEN cur;

  751. FETCH NEXT FROM cur INTO @SPID1, @Status11, @Login, @HostName, @BlkBy, @DBName, @Command, @CPUTime, @DiskIO, @LastBatch, @ProgramName, @SPID2, @RequestID;

  752. WHILE @@FETCH_STATUS = 0

  753. BEGIN

  754. -- 格式化并打印每一行的结果

  755. SET @result111 = 'SPID: ' + ISNULL(@SPID1, '') + ', ' +

  756. 'Status: ' + ISNULL(@Status11, '') + ', ' +

  757. 'Login: ' + ISNULL(@Login, '') + ', ' +

  758. 'HostName: ' + ISNULL(@HostName, '') + ', ' +

  759. 'BlkBy: ' + ISNULL(@BlkBy, '') + ', ' +

  760. 'DBName: ' + ISNULL(@DBName, '') + ', ' +

  761. 'Command: ' + ISNULL(@Command, '') + ', ' +

  762. 'CPUTime: ' + ISNULL(@CPUTime, '') + ', ' +

  763. 'DiskIO: ' + ISNULL(@DiskIO, '') + ', ' +

  764. 'LastBatch: ' + ISNULL(@LastBatch, '') + ', ' +

  765. 'ProgramName: ' + ISNULL(@ProgramName, '') + ', ' +

  766. 'SPID2: ' + ISNULL(@SPID2, '') + ', ' +

  767. 'RequestID: ' + ISNULL(@RequestID, '');

  768. PRINT @result111;

  769. FETCH NEXT FROM cur INTO @SPID1, @Status11, @Login, @HostName, @BlkBy, @DBName, @Command, @CPUTime, @DiskIO, @LastBatch, @ProgramName, @SPID2, @RequestID;

  770. END

  771. CLOSE cur;

  772. DEALLOCATE cur;

  773. -- 删除临时表

  774. DROP TABLE #Who2;

  775. SET NOCOUNT OFF;

  776. print '17.活动用户和进程的信息 '

  777. print'----------------------------'

  778. print '*********************************'

  779. SET NOCOUNT ON;

  780. exec sp_who 'active'

  781. SET NOCOUNT OFF;

  782. print '18.查看所有数据库用户所属的角色信息 '

  783. print'----------------------------'

  784. print '*********************************'

  785. exec sp_helpsrvrolemember

  786. SET NOCOUNT ON;

  787. -- 创建用于存储 sp_helpsrvrolemember 结果的临时表

  788. CREATE TABLE #SrvRoleMember (

  789. ServerRole NVARCHAR(255),

  790. MemberName NVARCHAR(255),

  791. MemberSID VARBINARY(MAX)

  792. );

  793. -- 将 sp_helpsrvrolemember 的结果插入到临时表中

  794. INSERT INTO #SrvRoleMember (ServerRole, MemberName, MemberSID)

  795. EXEC sp_helpsrvrolemember;

  796. -- 声明变量来存储每一行的结果

  797. DECLARE @ServerRole NVARCHAR(255);

  798. DECLARE @MemberName NVARCHAR(255);

  799. DECLARE @MemberSID NVARCHAR(MAX);

  800. DECLARE @result99 NVARCHAR(MAX);

  801. -- 将 MemberSID 转换为十六进制字符串

  802. DECLARE @HexMemberSID NVARCHAR(MAX);

  803. -- 游标遍历临时表

  804. DECLARE cur CURSOR FOR

  805. SELECT

  806. ServerRole,

  807. MemberName,

  808. CONVERT(NVARCHAR(MAX), MemberSID, 1) AS MemberSID -- 使用样式 1 转换为十六进制字符串

  809. FROM #SrvRoleMember;

  810. OPEN cur;

  811. FETCH NEXT FROM cur INTO @ServerRole, @MemberName, @MemberSID;

  812. WHILE @@FETCH_STATUS = 0

  813. BEGIN

  814. -- 格式化并打印每一行的结果

  815. SET @HexMemberSID = CONVERT(NVARCHAR(MAX), @MemberSID, 1); -- 确保 MemberSID 显示为十六进制字符串

  816. SET @result99 = 'ServerRole: ' + ISNULL(@ServerRole, '') + ', ' +

  817. 'MemberName: ' + ISNULL(@MemberName, '') + ', ' +

  818. 'MemberSID: ' + ISNULL(@HexMemberSID, '');

  819. PRINT @result99;

  820. FETCH NEXT FROM cur INTO @ServerRole, @MemberName, @MemberSID;

  821. END

  822. CLOSE cur;

  823. DEALLOCATE cur;

  824. -- 删除临时表

  825. DROP TABLE #SrvRoleMember;

  826. SET NOCOUNT OFF;

  827. print '19.查看链接服务器 '

  828. print'----------------------------'

  829. print '*********************************'

  830. SET NOCOUNT ON;

  831. exec sp_helplinkedsrvlogin

  832. SET NOCOUNT OFF;

  833. print '20.查询文件组和文件 '

  834. print'----------------------------'

  835. print '*********************************'

  836. SET NOCOUNT ON;

  837. select

  838. df.[name],df.physical_name,df.[size],df.growth,

  839. f.[name][filegroup],f.is_default

  840. from sys.database_files df join sys.filegroups f

  841. on df.data_space_id = f.data_space_id

  842. Go

  843. SET NOCOUNT ON;

  844. -- 创建用于存储查询结果的临时表

  845. CREATE TABLE #DatabaseFiles (

  846. name NVARCHAR(255),

  847. physical_name NVARCHAR(260),

  848. size INT,

  849. growth INT,

  850. filegroup NVARCHAR(255),

  851. is_default BIT

  852. );

  853. -- 将查询结果插入到临时表中

  854. INSERT INTO #DatabaseFiles (name, physical_name, size, growth, filegroup, is_default)

  855. SELECT

  856. df.[name],

  857. df.physical_name,

  858. df.[size],

  859. df.growth,

  860. f.[name] AS [filegroup],

  861. f.is_default

  862. FROM sys.database_files df

  863. JOIN sys.filegroups f ON df.data_space_id = f.data_space_id;

  864. -- 声明变量来存储每一行的结果

  865. DECLARE @name NVARCHAR(255);

  866. DECLARE @physical_name NVARCHAR(260);

  867. DECLARE @size NVARCHAR(10);

  868. DECLARE @growth NVARCHAR(10);

  869. DECLARE @filegroup NVARCHAR(255);

  870. DECLARE @is_default NVARCHAR(5);

  871. DECLARE @result NVARCHAR(MAX);

  872. -- 游标遍历临时表

  873. DECLARE cur CURSOR FOR

  874. SELECT

  875. name,

  876. physical_name,

  877. CAST(size AS NVARCHAR(10)),

  878. CAST(growth AS NVARCHAR(10)),

  879. filegroup,

  880. CAST(is_default AS NVARCHAR(5))

  881. FROM #DatabaseFiles;

  882. OPEN cur;

  883. FETCH NEXT FROM cur INTO @name, @physical_name, @size, @growth, @filegroup, @is_default;

  884. WHILE @@FETCH_STATUS = 0

  885. BEGIN

  886. -- 格式化并打印每一行的结果

  887. SET @result = 'Name: ' + ISNULL(@name, '') + ', ' +

  888. 'Physical Name: ' + ISNULL(@physical_name, '') + ', ' +

  889. 'Size: ' + ISNULL(@size, '') + ', ' +

  890. 'Growth: ' + ISNULL(@growth, '') + ', ' +

  891. 'Filegroup: ' + ISNULL(@filegroup, '') + ', ' +

  892. 'Is Default: ' + ISNULL(@is_default, '');

  893. PRINT @result;

  894. FETCH NEXT FROM cur INTO @name, @physical_name, @size, @growth, @filegroup, @is_default;

  895. END

  896. CLOSE cur;

  897. DEALLOCATE cur;

  898. -- 删除临时表

  899. DROP TABLE #DatabaseFiles;

  900. SET NOCOUNT OFF;

  901. print '21.查看SQL Server的实际内存占用 '

  902. print'----------------------------'

  903. print '*********************************'

  904. SET NOCOUNT ON;

  905. select * from sysperfinfo where counter_name like '%Memory%'

  906. -- 声明变量

  907. DECLARE @counter_name NVARCHAR(128);

  908. DECLARE @instance_name NVARCHAR(128);

  909. DECLARE @cntr_value BIGINT;

  910. DECLARE @row NVARCHAR(MAX);

  911. -- 声明游标

  912. DECLARE memory_cursor CURSOR FOR

  913. SELECT counter_name, instance_name, cntr_value

  914. FROM sys.dm_os_performance_counters

  915. WHERE counter_name LIKE '%Memory%';

  916. -- 打开游标

  917. OPEN memory_cursor;

  918. -- 获取第一行数据

  919. FETCH NEXT FROM memory_cursor INTO @counter_name, @instance_name, @cntr_value;

  920. -- 打印列名

  921. PRINT 'Counter Name | Instance Name | Counter Value';

  922. -- 遍历游标中的数据

  923. WHILE @@FETCH_STATUS = 0

  924. BEGIN

  925. -- 拼接每一行数据

  926. SET @row = LEFT(@counter_name + SPACE(20), 20) + ' | '

  927. + LEFT(ISNULL(@instance_name, 'N/A') + SPACE(20), 20) + ' | '

  928. + CAST(@cntr_value AS NVARCHAR);

  929. -- 打印当前行数据

  930. PRINT @row;

  931. -- 获取下一行数据

  932. FETCH NEXT FROM memory_cursor INTO @counter_name, @instance_name, @cntr_value;

  933. END

  934. -- 关闭游标

  935. CLOSE memory_cursor;

  936. -- 释放游标

  937. DEALLOCATE memory_cursor;

  938. SET NOCOUNT OFF;

  939. print '22.显示所有数据库的日志空间信息 '

  940. print'----------------------------'

  941. print '*********************************'

  942. SET NOCOUNT ON;

  943. dbcc sqlperf(logspace)

  944. Go

  945. -- 创建一个临时表来存储DBCC SQLPERF(LOGSPACE)的结果

  946. CREATE TABLE #LogSpace (

  947. [Database Name] NVARCHAR(128),

  948. [Log Size (MB)] FLOAT,

  949. [Log Space Used (%)] FLOAT,

  950. [Status] INT

  951. );

  952. -- 插入DBCC SQLPERF(LOGSPACE)的结果到临时表

  953. INSERT INTO #LogSpace

  954. EXEC ('DBCC SQLPERF(LOGSPACE)');

  955. -- 声明变量

  956. DECLARE @DatabaseName NVARCHAR(128);

  957. DECLARE @LogSizeMB FLOAT;

  958. DECLARE @LogSpaceUsedPercent FLOAT;

  959. DECLARE @Status INT;

  960. DECLARE @row NVARCHAR(MAX);

  961. -- 声明游标

  962. DECLARE logspace_cursor CURSOR FOR

  963. SELECT [Database Name], [Log Size (MB)], [Log Space Used (%)], [Status]

  964. FROM #LogSpace;

  965. -- 打开游标

  966. OPEN logspace_cursor;

  967. -- 获取第一行数据

  968. FETCH NEXT FROM logspace_cursor INTO @DatabaseName, @LogSizeMB, @LogSpaceUsedPercent, @Status;

  969. -- 打印列名

  970. PRINT 'Database Name | Log Size (MB) | Log Space Used (%) | Status';

  971. -- 遍历游标中的数据

  972. WHILE @@FETCH_STATUS = 0

  973. BEGIN

  974. -- 拼接每一行数据,并保证对齐

  975. SET @row = LEFT(@DatabaseName + SPACE(25), 25) + ' | '

  976. + RIGHT(SPACE(20) + CAST(@LogSizeMB AS NVARCHAR), 20) + ' | '

  977. + RIGHT(SPACE(25) + CAST(@LogSpaceUsedPercent AS NVARCHAR), 25) + ' | '

  978. + CAST(@Status AS NVARCHAR);

  979. -- 打印当前行数据

  980. PRINT @row;

  981. -- 获取下一行数据

  982. FETCH NEXT FROM logspace_cursor INTO @DatabaseName, @LogSizeMB, @LogSpaceUsedPercent, @Status;

  983. END

  984. -- 关闭游标

  985. CLOSE logspace_cursor;

  986. -- 释放游标

  987. DEALLOCATE logspace_cursor;

  988. -- 删除临时表

  989. DROP TABLE #LogSpace;

  990. select *,CAST(cntr_value/1024.0 as decimal(20,1)) MemoryMB

  991. from master.sys.sysperfinfo

  992. where counter_name='Total Server Memory (KB)'

  993. SET NOCOUNT OFF;

  994. print '23.查询表空间的已使用大小 '

  995. print'----------------------------'

  996. print '*********************************'

  997. SET NOCOUNT ON;

  998. SELECT

  999. DB_NAME() AS DatabaseName,

  1000. mf.name AS FileName,

  1001. mf.size * 8 / 1024 AS SizeMB,

  1002. mf.size * 8 / 1024 - FILEPROPERTY(mf.name, 'SpaceUsed') * 8 / 1024 AS FreeSpaceMB,

  1003. FILEPROPERTY(mf.name, 'SpaceUsed') * 8 / 1024 AS UsedSpaceMB

  1004. FROM

  1005. sys.master_files mf

  1006. WHERE

  1007. mf.database_id = DB_ID()

  1008. Go

  1009. -- 创建一个临时表来存储查询结果

  1010. CREATE TABLE #FileSpace (

  1011. DatabaseName NVARCHAR(128),

  1012. FileName NVARCHAR(128),

  1013. SizeMB DECIMAL(18, 2),

  1014. FreeSpaceMB DECIMAL(18, 2),

  1015. UsedSpaceMB DECIMAL(18, 2)

  1016. );

  1017. -- 插入查询结果到临时表

  1018. INSERT INTO #FileSpace

  1019. SELECT

  1020. DB_NAME() AS DatabaseName,

  1021. mf.name AS FileName,

  1022. mf.size * 8 / 1024 AS SizeMB,

  1023. mf.size * 8 / 1024 - FILEPROPERTY(mf.name, 'SpaceUsed') * 8 / 1024 AS FreeSpaceMB,

  1024. FILEPROPERTY(mf.name, 'SpaceUsed') * 8 / 1024 AS UsedSpaceMB

  1025. FROM

  1026. sys.master_files mf

  1027. WHERE

  1028. mf.database_id = DB_ID();

  1029. -- 声明变量

  1030. DECLARE @DatabaseName NVARCHAR(128);

  1031. DECLARE @FileName NVARCHAR(128);

  1032. DECLARE @SizeMB DECIMAL(18, 2);

  1033. DECLARE @FreeSpaceMB DECIMAL(18, 2);

  1034. DECLARE @UsedSpaceMB DECIMAL(18, 2);

  1035. DECLARE @row NVARCHAR(MAX);

  1036. -- 声明游标

  1037. DECLARE file_cursor CURSOR FOR

  1038. SELECT DatabaseName, FileName, SizeMB, FreeSpaceMB, UsedSpaceMB

  1039. FROM #FileSpace;

  1040. -- 打开游标

  1041. OPEN file_cursor;

  1042. -- 获取第一行数据

  1043. FETCH NEXT FROM file_cursor INTO @DatabaseName, @FileName, @SizeMB, @FreeSpaceMB, @UsedSpaceMB;

  1044. -- 打印列名

  1045. PRINT 'Database Name | File Name | Size (MB) | Free Space (MB) | Used Space (MB)';

  1046. -- 遍历游标中的数据

  1047. WHILE @@FETCH_STATUS = 0

  1048. BEGIN

  1049. -- 拼接每一行数据,并保证对齐

  1050. SET @row = LEFT(@DatabaseName + SPACE(20), 20) + ' | '

  1051. + LEFT(@FileName + SPACE(25), 25) + ' | '

  1052. + RIGHT(SPACE(15) + CAST(@SizeMB AS NVARCHAR(15)), 15) + ' | '

  1053. + RIGHT(SPACE(18) + CAST(@FreeSpaceMB AS NVARCHAR(18)), 18) + ' | '

  1054. + RIGHT(SPACE(15) + CAST(@UsedSpaceMB AS NVARCHAR(15)), 15);

  1055. -- 打印当前行数据

  1056. PRINT @row;

  1057. -- 获取下一行数据

  1058. FETCH NEXT FROM file_cursor INTO @DatabaseName, @FileName, @SizeMB, @FreeSpaceMB, @UsedSpaceMB;

  1059. END

  1060. -- 关闭游标

  1061. CLOSE file_cursor;

  1062. -- 释放游标

  1063. DEALLOCATE file_cursor;

  1064. -- 删除临时表

  1065. DROP TABLE #FileSpace;

  1066. SET NOCOUNT OFF;

  1067. print '----------------------------'

  1068. print ' 结束巡检 '

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值