SQL 2016 数据迁移助手(升级顾问)说我需要停止使用旧的系统表引用。也就是说,它希望我停止使用 sysdatabases 和 sysprocesses。
我有一些代码根据来自 sysprocesses 的数据记录会话信息。该日志中包含 spid (session_id) 的数据库 ID。
我一直在网上搜索,发现只有两个可能的替代品,由于下面解释的原因,这两个都不能完全工作。
选项 1 (sys.dm_tran_locks) - 如果我链接回 sys.dm_exec_sessions,此选项似乎工作得相当可靠,但我注意到如果 session_id 的数据库上下文是 master 或 tempdb,它永远不会返回结果。这意味着我将无法可靠地获取使用 master 或 tempdb 的任何 session_id 的 resource_database_id。我也不能只是假设它,因为至少有两种可能的上下文可供选择。
选项 2 (sys.dm_exec_requests) - 此选项仅适用于正在运行的 session_id。空闲/暂停的 session_id 不会出现在列表中。
如果我无法获得已挂起和/或正在使用主数据库上下文的 session_id 的 dbid,那么我的日志中就会出现空白。
有没有其他方法可以在不使用 sys.sysprocesses 的情况下可靠地获取此信息?
不幸的是,微软意识到缺乏替代品。您可以投票并观看这些 Connect 项目以获取更多详细信息:
sysprocesses 的弃用 - DMV 并未完全替换所有列 - Tony Rogerson SQL
master.dbo.sysprocesses 没有真正的替代品 - GV1973
将系统表映射到系统视图: https ://msdn.microsoft.com/en-us/library/ms187997.aspx
sys.dm_exec_sessions 和 sys.dm_exec_requests 的组合可能包含您需要的大部分内容。
如果您发布查询,我们应该能够帮助您编写符合 SQL2016 的版本。