(DIR) Return Create A Forum - Home --------------------------------------------------------- ExcelSoft Database Professionals (HTM) https://esdbp.createaforum.com --------------------------------------------------------- ***************************************************** (DIR) Return to: Scripts ***************************************************** #Post#: 161-------------------------------------------------- View Page Data By: srinivasma_exceldbp Date: June 24, 2015, 11:15 pm --------------------------------------------------------- USE [master] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO IF OBJECT_ID('sp_lib_ViewPageData') IS NOT NULL DROP PROC sp_lib_ViewPageData GO /*************************************************************** ******************************************* NAME SYNOPSIS table/page. Author NOTES must pass one, or you'll end up with no results. If the table name is passed, it will return the first page. @tableName must be '<databaseName>.<schemaName>.<tableName>' in order to function correctly. When called within the same database, the database prefix may be omitted. @printOption can be one of following values: 0 - print just the page header 1 - page header plus per-row hex dumps and a dump of the page slot array 2 - page header plus whole page hex dump 3 - page header plus detailed per-row interpretation Page Options borrowed from: (HTM) https://blogs.msdn.com/sqlserverstorageengine/archive/2006/06/10/625659.aspx @pageType must be one of the following values: Leaf - returns the first page of the leaf level of your index or heap Root - returns the root page of your index IAM - returns the index allocation map chain for your index or heap Conversions borrowed from: (HTM) http://sqlskills.com/blogs/paul/post/Inside-The-Storage-Engine- sp_AllocationMetadata-putting-undocumented-system-catalog-views- to-work.aspx USAGE: EXEC dbo.sp_lib_viewPageData @databaseName = 'AdventureWorks2012', @tableName = 'AdventureWorks2012.Sales.SalesOrderDetail', @indexName = 'IX_SalesOrderDetail_ProductID', --, @fileNumber = 1, --, @pageNumber = 38208, @printOption = 3, @pageType = 'Root'; **************************************************************** ******************************************/ create Procedure dbo.sp_lib_viewPageData /* Declare Parameters */ @databaseName varchar(128) , @tableName varchar(128) = Null -- database.schema.tableName , @indexName varchar(128) = Null , @fileNumber int = Null , @pageNumber int = Null , @printOption int = 3 -- 0, 1, 2, or 3 , @pageType char(4) = 'Leaf' -- Leaf, Root, or IAM As Set NoCount On; Set XACT_Abort On; Set Ansi_Padding On; Set Ansi_Warnings On; Set ArithAbort On; Set Concat_Null_Yields_Null On; Set Numeric_RoundAbort Off; Begin Declare @fileID int , @pageID int , @sqlStatement nvarchar(1200) , @sqlParameters nvarchar(255) , @errorMessage varchar(100); Begin Try If @fileNumber Is Null And @pageNumber Is Null And @tableName Is Null Begin Set @errorMessage = 'You must provide either a file/page number, or a table name!'; RaisError(@errorMessage, 16, 1); End; If @pageType Not In ('Leaf', 'Root', 'IAM') Begin Set @errorMessage = 'You have entered an invalid page type; valid options are "Leaf", "Root", or "IAM"'; RaisError(@errorMessage, 16, 1); End; If @fileNumber Is Null Or @pageNumber Is Null Begin Set @sqlStatement = Case When @pageType = 'Leaf' Then 'Select Top 1 @p_fileID = Convert (varchar(6), Convert (int, SubString (au.first_page, 6, 1) + SubString (au.first_page, 5, 1))) , @p_pageID = Convert (varchar(20), Convert (int, SubString (au.first_page, 4, 1) + SubString (au.first_page, 3, 1) + SubString (au.first_page, 2, 1) + SubString (au.first_page, 1, 1)))' When @pageType = 'Root' Then 'Select Top 1 @p_fileID = Convert (varchar(6), Convert (int, SubString (au.root_page, 6, 1) + SubString (au.root_page, 5, 1))) , @p_pageID = Convert (varchar(20), Convert (int, SubString (au.root_page, 4, 1) + SubString (au.root_page, 3, 1) + SubString (au.root_page, 2, 1) + SubString (au.root_page, 1, 1)))' When @pageType = 'IAM' Then 'Select Top 1 @p_fileID = Convert (varchar(6), Convert (int, SubString (au.first_iam_page, 6, 1) + SubString (au.first_iam_page, 5, 1))) , @p_pageID = Convert (varchar(20), Convert (int, SubString (au.first_iam_page, 4, 1) + SubString (au.first_iam_page, 3, 1) + SubString (au.first_iam_page, 2, 1) + SubString (au.first_iam_page, 1, 1)))' End + 'From ' + QuoteName(ParseName(@databaseName, 1)) + '.sys.indexes AS i Join ' + QuoteName(ParseName(@databaseName, 1)) + '.sys.partitions AS p On i.[object_id] = p.[object_id] And i.index_id = p.index_id Join ' + QuoteName(ParseName(@databaseName, 1)) + '.sys.system_internals_allocation_units AS au On p.hobt_id = au.container_id Where p.[object_id] = Object_ID(@p_tableName) And au.first_page > 0x000000000000 ' + Case When @indexName Is Null Then ';' Else 'And i.name = @p_indexName;' End; Set @sqlParameters = '@p_tableName varchar(128) , @p_indexName varchar(128) , @p_fileID int OUTPUT , @p_pageID int OUTPUT'; Execute sp_executeSQL @sqlStatement , @sqlParameters , @p_tableName = @tableName , @p_indexName = @indexName , @p_fileID = @fileID OUTPUT , @p_pageID = @pageID OUTPUT; End Else Begin Select @fileID = @fileNumber , @pageID = @pageNumber; End; DBCC TraceOn (3604); DBCC Page (@databaseName, @fileID, @pageID, @printOption); DBCC TraceOff (3604); End Try Begin Catch Print @errorMessage; End Catch; Set NoCount Off; Return 0; End Go exec sp_ms_marksystemobject 'sp_lib_ViewPageData' go grant exec on sp_lib_ViewPageData to public go *****************************************************