SQLsever误删数据恢复

​ 创建存储过程

语句如下

-- Script Name: Recover_Deleted_Data_Proc

– Script Type : Recovery Procedure
– Develop By: Muhammad Imran
– Date Created: 15 Oct 2011
– Modify Date: 22 Aug 2012
– Version : 3.1
– Notes : Included BLOB data types for recovery.& Compatibile with Default , CS collation , Arabic_CI_AS.

CREATE PROCEDURE Recover_Deleted_Data_Proc
@Database_Name NVARCHAR(MAX) ,
@SchemaName_n_TableName NVARCHAR(MAX) ,
@Date_From DATETIME = ‘1900/01/01’ ,
@Date_To DATETIME = ‘9999/12/31’
AS
DECLARE @RowLogContents VARBINARY(8000)
DECLARE @TransactionID NVARCHAR(MAX)
DECLARE @AllocUnitID BIGINT
DECLARE @AllocUnitName NVARCHAR(MAX)
DECLARE @SQL NVARCHAR(MAX)
DECLARE @Compatibility_Level INT

SELECT  @Compatibility_Level = dtb.compatibility_level
FROM    master.sys.databases AS dtb
WHERE   dtb.name = @Database_NameIF ISNULL(@Compatibility_Level, 0) <= 80BEGINRAISERROR('The compatibility level should be equal to or greater SQL SERVER 2005 (90)',16,1)RETURNENDIF ( SELECT COUNT(*)FROM   INFORMATION_SCHEMA.TABLESWHERE  [TABLE_SCHEMA] + '.' + [TABLE_NAME] = @SchemaName_n_TableName) = 0BEGINRAISERROR('Could not found the table in the defined database',16,1)RETURNENDDECLARE @bitTable TABLE([ID] INT ,[Bitvalue] INT)

–Create table to set the bit position of one byte.

INSERT  INTO @bitTableSELECT  0 ,2UNION ALLSELECT  1 ,2UNION ALLSELECT  2 ,4UNION ALLSELECT  3 ,8UNION ALLSELECT  4 ,16UNION ALLSELECT  5 ,32UNION ALLSELECT  6 ,64UNION ALLSELECT  7 ,128

–Create table to collect the row data.
DECLARE @DeletedRecords TABLE
(
[Row ID] INT IDENTITY(1, 1) ,
[RowLogContents] VARBINARY(8000) ,
[AllocUnitID] BIGINT ,
[Transaction ID] NVARCHAR(MAX) ,
[FixedLengthData] SMALLINT ,
[TotalNoOfCols] SMALLINT ,
[NullBitMapLength] SMALLINT ,
[NullBytes] VARBINARY(8000) ,
[TotalNoofVarCols] SMALLINT ,
[ColumnOffsetArray] VARBINARY(8000) ,
[VarColumnStart] SMALLINT ,
[Slot ID] INT ,
[NullBitMap] VARCHAR(MAX)
)
–Create a common table expression to get all the row data plus how many bytes we have for each row.
;
WITH RowData
AS ( SELECT [RowLog Contents 0] AS [RowLogContents] ,
[AllocUnitID] AS [AllocUnitID] ,
[Transaction ID] AS [Transaction ID]

–[Fixed Length Data] = Substring (RowLog content 0, Status Bit A+ Status Bit B + 1,2 bytes)
,
CONVERT(SMALLINT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
2 + 1, 2)))) AS [FixedLengthData] --@FixedLengthData

– [TotalnoOfCols] = Substring (RowLog content 0, [Fixed Length Data] + 1,2 bytes)
,
CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
CONVERT(SMALLINT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
2 + 1, 2)))) + 1,
2)))) AS [TotalNoOfCols]

–[NullBitMapLength]=ceiling([Total No of Columns] /8.0)
,
CONVERT(INT, CEILING(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
CONVERT(SMALLINT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
2 + 1, 2)))) + 1,
2)))) / 8.0)) AS [NullBitMapLength]

–[Null Bytes] = Substring (RowLog content 0, Status Bit A+ Status Bit B + [Fixed Length Data] +1, [NullBitMapLength] )
,
SUBSTRING([RowLog Contents 0],
CONVERT(SMALLINT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
2 + 1, 2)))) + 3,
CONVERT(INT, CEILING(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
CONVERT(SMALLINT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
2 + 1, 2)))) + 1,
2)))) / 8.0))) AS [NullBytes]

–[TotalNoofVarCols] = Substring (RowLog content 0, Status Bit A+ Status Bit B + [Fixed Length Data] +1, [Null Bitmap length] + 2 )
,
( CASE WHEN SUBSTRING([RowLog Contents 0], 1, 1) IN (
0x10, 0x30, 0x70 )
THEN CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
CONVERT(SMALLINT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
2 + 1, 2)))) + 3
+ CONVERT(INT, CEILING(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
CONVERT(SMALLINT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
2 + 1, 2)))) + 1,
2)))) / 8.0)), 2))))
ELSE NULL
END ) AS [TotalNoofVarCols]

–[ColumnOffsetArray]= Substring (RowLog content 0, Status Bit A+ Status Bit B + [Fixed Length Data] +1, [Null Bitmap length] + 2 , [TotalNoofVarCols]*2 )
,
( CASE WHEN SUBSTRING([RowLog Contents 0], 1, 1) IN (
0x10, 0x30, 0x70 )
THEN SUBSTRING([RowLog Contents 0],
CONVERT(SMALLINT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
2 + 1, 2)))) + 3
+ CONVERT(INT, CEILING(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
CONVERT(SMALLINT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
2 + 1, 2)))) + 1,
2)))) / 8.0))
+ 2,
( CASE WHEN SUBSTRING([RowLog Contents 0],
1, 1) IN ( 0x10,
0x30, 0x70 )
THEN CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
CONVERT(SMALLINT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
2 + 1, 2)))) + 3
+ CONVERT(INT, CEILING(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
CONVERT(SMALLINT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
2 + 1, 2)))) + 1,
2)))) / 8.0)), 2))))
ELSE NULL
END ) * 2)
ELSE NULL
END ) AS [ColumnOffsetArray]

– Variable column Start = Status Bit A+ Status Bit B + [Fixed Length Data] + [Null Bitmap length] + 2+([TotalNoofVarCols]*2)
,
CASE WHEN SUBSTRING([RowLog Contents 0], 1, 1) IN (
0x10, 0x30, 0x70 )
THEN ( CONVERT(SMALLINT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
2 + 1, 2)))) + 4
+ CONVERT(INT, CEILING(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
CONVERT(SMALLINT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
2 + 1, 2)))) + 1,
2)))) / 8.0))
+ ( ( CASE WHEN SUBSTRING([RowLog Contents 0],
1, 1) IN ( 0x10,
0x30, 0x70 )
THEN CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
CONVERT(SMALLINT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
2 + 1, 2)))) + 3
+ CONVERT(INT, CEILING(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
CONVERT(SMALLINT, CONVERT(BINARY(2), REVERSE(SUBSTRING([RowLog Contents 0],
2 + 1, 2)))) + 1,
2)))) / 8.0)), 2))))
ELSE NULL
END ) * 2 ) )
ELSE NULL
END AS [VarColumnStart] ,
[Slot ID]
FROM sys.fn_dblog(NULL, NULL)
WHERE AllocUnitId IN (
SELECT [Allocation_unit_id]
FROM sys.allocation_units allocunits
INNER JOIN sys.partitions partitions ON ( allocunits.type IN (
1, 3 )
AND partitions.hobt_id = allocunits.container_id
)
OR ( allocunits.type = 2
AND partitions.partition_id = allocunits.container_id
)
WHERE object_id = OBJECT_ID(’’
+ @SchemaName_n_TableName
+ ‘’) )
​ AND Context IN ( ‘LCX_MARK_AS_GHOST’, ‘LCX_HEAP’ )
​ AND Operation IN ( ‘LOP_DELETE_ROWS’ )
​ AND SUBSTRING([RowLog Contents 0], 1, 1) IN ( 0x10,
0x30, 0x70 )

/Use this subquery to filter the date/
AND [TRANSACTION ID] IN (
SELECT DISTINCT
[TRANSACTION ID]
FROM sys.fn_dblog(NULL, NULL)
WHERE Context IN ( ‘LCX_NULL’ )
AND Operation IN ( ‘LOP_BEGIN_XACT’ )
AND [Transaction Name] IN ( ‘DELETE’,
‘user_transaction’ )
AND CONVERT(NVARCHAR(11), [Begin Time]) BETWEEN @Date_From
AND
@Date_To )
),

–Use this technique to repeate the row till the no of bytes of the row.
N1 ( n )
AS ( SELECT 1
UNION ALL
SELECT 1
),
N2 ( n )
AS ( SELECT 1
FROM N1 AS X ,
N1 AS Y
),
N3 ( n )
AS ( SELECT 1
FROM N2 AS X ,
N2 AS Y
),
N4 ( n )
AS ( SELECT ROW_NUMBER() OVER ( ORDER BY X.n )
FROM N3 AS X ,
N3 AS Y
)
INSERT INTO @DeletedRecords
SELECT RowLogContents ,
[AllocUnitID] ,
[Transaction ID] ,
[FixedLengthData] ,
[TotalNoOfCols] ,
[NullBitMapLength] ,
[NullBytes] ,
[TotalNoofVarCols] ,
[ColumnOffsetArray] ,
[VarColumnStart] ,
[Slot ID]
—Get the Null value against each column (1 means null zero means not null)
,
[NullBitMap] = ( REPLACE(STUFF(( SELECT
‘,’
+ ( CASE
WHEN [ID] = 0
THEN CONVERT(NVARCHAR(1), ( SUBSTRING(NullBytes,
n, 1) % 2 ))
ELSE CONVERT(NVARCHAR(1), ( ( SUBSTRING(NullBytes,
n, 1)
/ [Bitvalue] )
% 2 ))
END ) --as [nullBitMap]
FROM N4 AS Nums
JOIN RowData AS C ON n <= NullBitMapLength
CROSS JOIN @bitTable
WHERE
C.[RowLogContents] = D.[RowLogContents]
ORDER BY [RowLogContents] ,
n ASC
FOR
XML PATH(’’)
), 1, 1, ‘’), ‘,’, ‘’) )
FROM RowData D

IF ( SELECT COUNT(*)FROM   @DeletedRecords) = 0BEGINRAISERROR('There is no data in the log as per the search criteria',16,1)RETURNENDDECLARE @ColumnNameAndData TABLE([Row ID] INT ,[Rowlogcontents] VARBINARY(MAX) ,[NAME] SYSNAME ,[nullbit] SMALLINT ,[leaf_offset] SMALLINT ,[length] SMALLINT ,[system_type_id] TINYINT ,[bitpos] TINYINT ,[xprec] TINYINT ,[xscale] TINYINT ,[is_null] INT ,[Column value Size] INT ,[Column Length] INT ,[hex_Value] VARBINARY(MAX) ,[Slot ID] INT ,[Update] INT)

–Create common table expression and join it with the rowdata table
– to get each column details
/This part is for variable data columns/
–@RowLogContents,
–(col.columnOffValue - col.columnLength) + 1,
–col.columnLength
–)
INSERT INTO @ColumnNameAndData
SELECT [Row ID] ,
Rowlogcontents ,
NAME ,
cols.leaf_null_bit AS nullbit ,
leaf_offset ,
ISNULL(syscolumns.length, cols.max_length) AS [length] ,
cols.system_type_id ,
cols.leaf_bit_position AS bitpos ,
ISNULL(syscolumns.xprec, cols.precision) AS xprec ,
ISNULL(syscolumns.xscale, cols.scale) AS xscale ,
SUBSTRING([nullBitMap], cols.leaf_null_bit, 1) AS is_null ,
( CASE WHEN leaf_offset < 1
AND SUBSTRING([nullBitMap], cols.leaf_null_bit,
1) = 0
THEN ( CASE WHEN CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2)))) > 30000
THEN CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2))))
- POWER(2, 15)
ELSE CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2))))
END )
END ) AS [Column value Size] ,
( CASE WHEN leaf_offset < 1
AND SUBSTRING([nullBitMap], cols.leaf_null_bit,
1) = 0
THEN ( CASE WHEN CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2)))) > 30000
AND ISNULL(NULLIF(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* ( ( leaf_offset
* -1 ) - 1 ) )
- 1, 2)))), 0),
[varColumnStart]) < 30000
THEN ( CASE WHEN [System_type_id] IN (
35, 34, 99 ) THEN 16
ELSE 24
END )
WHEN CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2)))) > 30000
AND ISNULL(NULLIF(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* ( ( leaf_offset
* -1 ) - 1 ) )
- 1, 2)))), 0),
[varColumnStart]) > 30000
THEN ( CASE WHEN [System_type_id] IN (
35, 34, 99 ) THEN 16
ELSE 24
END ) --24
WHEN CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2)))) < 30000
AND ISNULL(NULLIF(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* ( ( leaf_offset
* -1 ) - 1 ) )
- 1, 2)))), 0),
[varColumnStart]) < 30000
THEN ( CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2))))
- ISNULL(NULLIF(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* ( ( leaf_offset
* -1 ) - 1 ) )
- 1, 2)))), 0),
[varColumnStart]) )
WHEN CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2)))) < 30000
AND ISNULL(NULLIF(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* ( ( leaf_offset
* -1 ) - 1 ) )
- 1, 2)))), 0),
[varColumnStart]) > 30000
THEN POWER(2, 15)
+ CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2))))
- ISNULL(NULLIF(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* ( ( leaf_offset
* -1 ) - 1 ) )
- 1, 2)))), 0),
[varColumnStart])
END )
END ) AS [Column Length] ,
( CASE WHEN SUBSTRING([nullBitMap], cols.leaf_null_bit, 1) = 1
THEN NULL
ELSE SUBSTRING(Rowlogcontents,
( ( CASE WHEN CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2)))) > 30000
THEN CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2))))
- POWER(2, 15)
ELSE CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2))))
END )
- ( CASE WHEN CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2)))) > 30000
AND ISNULL(NULLIF(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* ( ( leaf_offset
* -1 ) - 1 ) )
- 1, 2)))), 0),
[varColumnStart]) < 30000
THEN ( CASE
WHEN [System_type_id] IN (
35, 34, 99 )
THEN 16
ELSE 24
END ) --24
WHEN CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2)))) > 30000
AND ISNULL(NULLIF(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* ( ( leaf_offset
* -1 ) - 1 ) )
- 1, 2)))), 0),
[varColumnStart]) > 30000
THEN ( CASE
WHEN [System_type_id] IN (
35, 34, 99 )
THEN 16
ELSE 24
END ) --24
WHEN CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2)))) < 30000
AND ISNULL(NULLIF(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* ( ( leaf_offset
* -1 ) - 1 ) )
- 1, 2)))), 0),
[varColumnStart]) < 30000
THEN CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2))))
- ISNULL(NULLIF(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* ( ( leaf_offset
* -1 ) - 1 ) )
- 1, 2)))), 0),
[varColumnStart])
WHEN CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2)))) < 30000
AND ISNULL(NULLIF(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* ( ( leaf_offset
* -1 ) - 1 ) )
- 1, 2)))), 0),
[varColumnStart]) > 30000
THEN POWER(2, 15)
+ CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2))))
- ISNULL(NULLIF(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* ( ( leaf_offset
* -1 ) - 1 ) )
- 1, 2)))), 0),
[varColumnStart])
END ) ) + 1,
( CASE WHEN CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2)))) > 30000
AND ISNULL(NULLIF(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* ( ( leaf_offset
* -1 ) - 1 ) )
- 1, 2)))), 0),
[varColumnStart]) < 30000
THEN ( CASE WHEN [System_type_id] IN (
35, 34, 99 )
THEN 16
ELSE 24
END ) --24
WHEN CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2)))) > 30000
AND ISNULL(NULLIF(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* ( ( leaf_offset
* -1 ) - 1 ) )
- 1, 2)))), 0),
[varColumnStart]) > 30000
THEN ( CASE WHEN [System_type_id] IN (
35, 34, 99 )
THEN 16
ELSE 24
END ) --24
WHEN CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2)))) < 30000
AND ISNULL(NULLIF(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* ( ( leaf_offset
* -1 ) - 1 ) )
- 1, 2)))), 0),
[varColumnStart]) < 30000
THEN ABS(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2))))
- ISNULL(NULLIF(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* ( ( leaf_offset
* -1 ) - 1 ) )
- 1, 2)))), 0),
[varColumnStart]))
WHEN CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2)))) < 30000
AND ISNULL(NULLIF(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* ( ( leaf_offset
* -1 ) - 1 ) )
- 1, 2)))), 0),
[varColumnStart]) > 30000
THEN POWER(2, 15)
+ CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* leaf_offset
* -1 ) - 1, 2))))
- ISNULL(NULLIF(CONVERT(INT, CONVERT(BINARY(2), REVERSE(SUBSTRING([ColumnOffsetArray],
( 2
* ( ( leaf_offset
* -1 ) - 1 ) )
- 1, 2)))), 0),
[varColumnStart])
END ))
END ) AS hex_Value ,
[Slot ID] ,
0
FROM @DeletedRecords A
INNER JOIN sys.allocation_units allocunits ON A.[AllocUnitId] = allocunits.[Allocation_Unit_Id]
INNER JOIN sys.partitions partitions ON ( allocunits.type IN (
1, 3 )
AND partitions.hobt_id = allocunits.container_id
)
OR ( allocunits.type = 2
AND partitions.partition_id = allocunits.container_id
)
INNER JOIN sys.system_internals_partition_columns cols ON cols.partition_id = partitions.partition_id
LEFT OUTER JOIN syscolumns ON syscolumns.id = partitions.object_id
AND syscolumns.colid = cols.partition_column_id
WHERE leaf_offset < 0
UNION
/This part is for fixed data columns/
SELECT [Row ID] ,
Rowlogcontents ,
NAME ,
cols.leaf_null_bit AS nullbit ,
leaf_offset ,
ISNULL(syscolumns.length, cols.max_length) AS [length] ,
cols.system_type_id ,
cols.leaf_bit_position AS bitpos ,
ISNULL(syscolumns.xprec, cols.precision) AS xprec ,
ISNULL(syscolumns.xscale, cols.scale) AS xscale ,
SUBSTRING([nullBitMap], cols.leaf_null_bit, 1) AS is_null ,
( SELECT TOP 1
ISNULL(SUM(CASE WHEN C.leaf_offset > 1
THEN max_length
ELSE 0
END), 0)
FROM sys.system_internals_partition_columns C
WHERE cols.partition_id = C.partition_id
AND C.leaf_null_bit < cols.leaf_null_bit
) + 5 AS [Column value Size] ,
syscolumns.length AS [Column Length] ,
CASE WHEN SUBSTRING([nullBitMap], cols.leaf_null_bit, 1) = 1
THEN NULL
ELSE SUBSTRING(Rowlogcontents,
( SELECT TOP 1
ISNULL(SUM(CASE
WHEN C.leaf_offset > 1
AND C.leaf_bit_position = 0
THEN max_length
ELSE 0
END), 0)
FROM sys.system_internals_partition_columns C
WHERE cols.partition_id = C.partition_id
AND C.leaf_null_bit < cols.leaf_null_bit
) + 5, syscolumns.length)
END AS hex_Value ,
[Slot ID] ,
0
FROM @DeletedRecords A
INNER JOIN sys.allocation_units allocunits ON A.[AllocUnitId] = allocunits.[Allocation_Unit_Id]
INNER JOIN sys.partitions partitions ON ( allocunits.type IN (
1, 3 )
AND partitions.hobt_id = allocunits.container_id
)
OR ( allocunits.type = 2
AND partitions.partition_id = allocunits.container_id
)
INNER JOIN sys.system_internals_partition_columns cols ON cols.partition_id = partitions.partition_id
LEFT OUTER JOIN syscolumns ON syscolumns.id = partitions.object_id
AND syscolumns.colid = cols.partition_column_id
WHERE leaf_offset > 0
ORDER BY nullbit

DECLARE @BitColumnByte AS INT
SELECT  @BitColumnByte = CONVERT(INT, CEILING(COUNT(*) / 8.0))
FROM    @ColumnNameAndData
WHERE   [System_Type_id] = 104;
WITH    N1 ( n )AS ( SELECT   1UNION ALLSELECT   1),N2 ( n )AS ( SELECT   1FROM     N1 AS X ,N1 AS Y),N3 ( n )AS ( SELECT   1FROM     N2 AS X ,N2 AS Y),N4 ( n )AS ( SELECT   ROW_NUMBER() OVER ( ORDER BY X.n )FROM     N3 AS X ,N3 AS Y),CTEAS ( SELECT   RowLogContents ,[nullbit] ,[BitMap] = CONVERT(VARBINARY(1), CONVERT(INT, SUBSTRING(( REPLACE(STUFF(( SELECT','+ ( CASEWHEN [ID] = 0THEN CONVERT(NVARCHAR(1), ( SUBSTRING(hex_Value,n, 1) % 2 ))ELSE CONVERT(NVARCHAR(1), ( ( SUBSTRING(hex_Value,n, 1)/ [Bitvalue] )% 2 ))END ) --as [nullBitMap]FROMN4 AS NumsJOIN @ColumnNameAndDataAS C ON n <= @BitColumnByteAND [System_Type_id] = 104AND bitpos = 0CROSS JOIN @bitTableWHEREC.[RowLogContents] = D.[RowLogContents]ORDER BY [RowLogContents] ,n ASCFORXMLPATH('')), 1, 1, ''),',', '') ),bitpos + 1, 1)))FROM     @ColumnNameAndData DWHERE    [System_Type_id] = 104)UPDATE  ASET     [hex_Value] = [BitMap]FROM    @ColumnNameAndData AINNER JOIN CTE B ON A.[RowLogContents] = B.[RowLogContents]AND A.[nullbit] = B.[nullbit]

/Check for BLOB DATA TYPES****************/
DECLARE @Fileid INT
DECLARE @Pageid INT
DECLARE @Slotid INT
DECLARE @CurrentLSN INT
DECLARE @LinkID INT
DECLARE @Context VARCHAR(50)
DECLARE @ConsolidatedPageID VARCHAR(MAX)
DECLARE @LCX_TEXT_MIX VARBINARY(MAX)

DECLARE @temppagedata TABLE([ParentObject] SYSNAME ,[Object] SYSNAME ,[Field] SYSNAME ,[Value] SYSNAME)DECLARE @pagedata TABLE([Page ID] SYSNAME ,[File IDS] INT ,[Page IDS] INT ,[AllocUnitId] BIGINT ,[ParentObject] SYSNAME ,[Object] SYSNAME ,[Field] SYSNAME ,[Value] SYSNAME)DECLARE @ModifiedRawData TABLE([ID] INT IDENTITY(1, 1) ,[PAGE ID] VARCHAR(MAX) ,[FILE IDS] INT ,[PAGE IDS] INT ,[Slot ID] INT ,[AllocUnitId] BIGINT ,[RowLog Contents 0_var] VARCHAR(MAX) ,[RowLog Length] VARCHAR(50) ,[RowLog Len] INT ,[RowLog Contents 0] VARBINARY(MAX) ,[Link ID] INT DEFAULT ( 0 ) ,[Update] INT)DECLARE Page_Data_Cursor CURSOR
FOR/*We need to filter LOP_MODIFY_ROW,LOP_MODIFY_COLUMNS from log for deleted records of BLOB data type& Get its Slot No, Page ID & AllocUnit ID*/SELECT  LTRIM(RTRIM(REPLACE([Description], 'Deallocated', ''))) AS [PAGE ID] ,[Slot ID] ,[AllocUnitId] ,NULL AS [RowLog Contents 0] ,NULL AS [RowLog Contents 0] ,ContextFROM    sys.fn_dblog(NULL, NULL)WHERE   AllocUnitId IN (SELECT  [Allocation_unit_id]FROM    sys.allocation_units allocunitsINNER JOIN sys.partitions partitions ON ( allocunits.type IN (1, 3 )AND partitions.hobt_id = allocunits.container_id)OR ( allocunits.type = 2AND partitions.partition_id = allocunits.container_id)WHERE   object_id = OBJECT_ID('' + @SchemaName_n_TableName+ '') )AND Operation IN ( 'LOP_MODIFY_ROW' )AND [Context] IN ( 'LCX_PFS' )AND Description LIKE '%Deallocated%'/*Use this subquery to filter the date*/AND [TRANSACTION ID] IN (SELECT DISTINCT[TRANSACTION ID]FROM    sys.fn_dblog(NULL, NULL)WHERE   Context IN ( 'LCX_NULL' )AND Operation IN ( 'LOP_BEGIN_XACT' )AND [Transaction Name] = 'DELETE'AND CONVERT(NVARCHAR(11), [Begin Time]) BETWEEN @Date_FromAND@Date_To )GROUP BY [Description] ,[Slot ID] ,[AllocUnitId] ,ContextUNIONSELECT  [PAGE ID] ,[Slot ID] ,[AllocUnitId] ,SUBSTRING([RowLog Contents 0], 15,LEN([RowLog Contents 0])) AS [RowLog Contents 0] ,CONVERT(INT, SUBSTRING([RowLog Contents 0], 7, 2)) ,Context --,CAST(RIGHT([Current LSN],4) AS INT) AS [Current LSN]FROM    sys.fn_dblog(NULL, NULL)WHERE   AllocUnitId IN (SELECT  [Allocation_unit_id]FROM    sys.allocation_units allocunitsINNER JOIN sys.partitions partitions ON ( allocunits.type IN (1, 3 )AND partitions.hobt_id = allocunits.container_id)OR ( allocunits.type = 2AND partitions.partition_id = allocunits.container_id)WHERE   object_id = OBJECT_ID('' + @SchemaName_n_TableName+ '') )AND Context IN ( 'LCX_TEXT_MIX' )AND Operation IN ( 'LOP_DELETE_ROWS' ) /*Use this subquery to filter the date*/AND [TRANSACTION ID] IN (SELECT DISTINCT[TRANSACTION ID]FROM    sys.fn_dblog(NULL, NULL)WHERE   Context IN ( 'LCX_NULL' )AND Operation IN ( 'LOP_BEGIN_XACT' )AND [Transaction Name] = 'DELETE'AND CONVERT(NVARCHAR(11), [Begin Time]) BETWEEN @Date_FromAND@Date_To )/****************************************/OPEN Page_Data_CursorFETCH NEXT FROM Page_Data_Cursor INTO @ConsolidatedPageID, @Slotid,@AllocUnitID, @LCX_TEXT_MIX, @LinkID, @ContextWHILE @@FETCH_STATUS = 0BEGINDECLARE @hex_pageid AS VARCHAR(MAX)/*Page ID contains File Number and page number It looks like 0001:00000130.In this example 0001 is file Number &  00000130 is Page Number & These numbers are in Hex format*/SET @Fileid = SUBSTRING(@ConsolidatedPageID, 0,CHARINDEX(':', @ConsolidatedPageID)) -- Seperate File ID from Page IDSET @hex_pageid = '0x' + SUBSTRING(@ConsolidatedPageID,CHARINDEX(':',@ConsolidatedPageID)+ 1, LEN(@ConsolidatedPageID))  ---Seperate the page IDSELECT  @Pageid = CONVERT(INT, CAST('' AS XML).value('xs:hexBinary(substring(sql:variable("@hex_pageid"),sql:column("t.pos")) )','varbinary(max)')) -- Convert Page ID from hex to integerFROM    ( SELECT    CASE SUBSTRING(@hex_pageid, 1, 2)WHEN '0x' THEN 3ELSE 0END) AS t ( pos ) IF @Context = 'LCX_PFS'BEGINDELETE  @temppagedataINSERT  INTO @temppagedataEXEC( 'DBCC PAGE(' + @DataBase_Name + ', '+ @fileid + ', ' + @pageid+ ', 1) with tableresults,no_infomsgs;'); INSERT  INTO @pagedataSELECT  @ConsolidatedPageID ,@fileid ,@pageid ,@AllocUnitID ,[ParentObject] ,[Object] ,[Field] ,[Value]FROM    @temppagedataENDELSEIF @Context = 'LCX_TEXT_MIX'BEGININSERT  INTO @ModifiedRawDataSELECT  @ConsolidatedPageID ,@fileid ,@pageid ,@Slotid ,@AllocUnitID ,NULL ,0 ,CONVERT(INT, CONVERT(VARBINARY, REVERSE(SUBSTRING(@LCX_TEXT_MIX,11, 2)))) ,@LCX_TEXT_MIX ,@LinkID ,0END    FETCH NEXT FROM Page_Data_Cursor INTO @ConsolidatedPageID, @Slotid,@AllocUnitID, @LCX_TEXT_MIX, @LinkID, @ContextENDCLOSE Page_Data_Cursor
DEALLOCATE Page_Data_CursorDECLARE @Newhexstring VARCHAR(MAX);--The data is in multiple rows in the page, so we need to convert it into one row as a single hex value.
--This hex value is in string format
INSERT  INTO @ModifiedRawData( [PAGE ID] ,[FILE IDS] ,[PAGE IDS] ,[Slot ID] ,[AllocUnitId] ,[RowLog Contents 0_var] ,[RowLog Length])SELECT  [Page ID] ,[FILE IDS] ,[PAGE IDS] ,SUBSTRING([ParentObject],CHARINDEX('Slot', [ParentObject]) + 4,( CHARINDEX('Offset', [ParentObject])- ( CHARINDEX('Slot', [ParentObject]) + 4 ) )- 2) AS [Slot ID] ,[AllocUnitId] ,SUBSTRING(( SELECT  REPLACE(STUFF(( SELECTREPLACE(SUBSTRING([Value],CHARINDEX(':',[Value]) + 1,CHARINDEX('†',[Value])- CHARINDEX(':',[Value])), '†','')FROM  @pagedata CWHERE B.[Page ID] = C.[Page ID]AND SUBSTRING(B.[ParentObject],CHARINDEX('Slot',B.[ParentObject])+ 4,( CHARINDEX('Offset',B.[ParentObject])- ( CHARINDEX('Slot',B.[ParentObject])+ 4 ) )) = SUBSTRING(C.[ParentObject],CHARINDEX('Slot',C.[ParentObject])+ 4,( CHARINDEX('Offset',C.[ParentObject])- ( CHARINDEX('Slot',C.[ParentObject])+ 4 ) ))AND [Object] LIKE '%Memory Dump%'ORDER BY '0x'+ LEFT([Value],CHARINDEX(':',[Value]) - 1)FORXML PATH('')), 1, 1, ''), ' ', '')), 1, 20000) AS [Value] ,SUBSTRING(( SELECT  '0x'+ REPLACE(STUFF(( SELECTREPLACE(SUBSTRING([Value],CHARINDEX(':',[Value]) + 1,CHARINDEX('†',[Value])- CHARINDEX(':',[Value])), '†','')FROM@pagedata CWHEREB.[Page ID] = C.[Page ID]AND SUBSTRING(B.[ParentObject],CHARINDEX('Slot',B.[ParentObject])+ 4,( CHARINDEX('Offset',B.[ParentObject])- ( CHARINDEX('Slot',B.[ParentObject])+ 4 ) )) = SUBSTRING(C.[ParentObject],CHARINDEX('Slot',C.[ParentObject])+ 4,( CHARINDEX('Offset',C.[ParentObject])- ( CHARINDEX('Slot',C.[ParentObject])+ 4 ) ))AND [Object] LIKE '%Memory Dump%'ORDER BY '0x'+ LEFT([Value],CHARINDEX(':',[Value]) - 1)FORXML PATH('')), 1, 1, ''), ' ', '')), 7, 4) AS [Length]FROM    @pagedata BWHERE   [Object] LIKE '%Memory Dump%'GROUP BY [Page ID] ,[FILE IDS] ,[PAGE IDS] ,[ParentObject] ,[AllocUnitId]--,[Current LSN]ORDER BY [Slot ID]UPDATE  @ModifiedRawData
SET     [RowLog Len] = CONVERT(VARBINARY(8000), REVERSE(CAST('' AS XML).value('xs:hexBinary(substring(sql:column("[RowLog Length]"),0))','varbinary(Max)')))
FROM    @ModifiedRawData
WHERE   [LINK ID] = 0UPDATE  @ModifiedRawData
SET     [RowLog Contents 0] = CAST('' AS XML).value('xs:hexBinary(substring(sql:column("[RowLog Contents 0_var]"),0))','varbinary(Max)')
FROM    @ModifiedRawData
WHERE   [LINK ID] = 0UPDATE  B
SET     B.[RowLog Contents 0] = ( CASE WHEN A.[RowLog Contents 0] IS NOT NULLAND C.[RowLog Contents 0] IS NOT NULLTHEN A.[RowLog Contents 0]+ C.[RowLog Contents 0]WHEN A.[RowLog Contents 0] IS NULLAND C.[RowLog Contents 0] IS NOT NULLTHEN C.[RowLog Contents 0]WHEN A.[RowLog Contents 0] IS NOT NULLAND C.[RowLog Contents 0] IS NULLTHEN A.[RowLog Contents 0]END ) ,B.[Update] = ISNULL(B.[Update], 0) + 1
FROM    @ModifiedRawData BLEFT JOIN @ModifiedRawData A ON A.[Page IDS] = CONVERT(INT, CONVERT(VARBINARY(MAX), REVERSE(SUBSTRING(B.[RowLog Contents 0],15 + 14, 2))))AND A.[File IDS] = CONVERT(INT, CONVERT(VARBINARY(MAX), REVERSE(SUBSTRING(B.[RowLog Contents 0],19 + 14, 2))))AND A.[Link ID] = B.[Link ID]LEFT JOIN @ModifiedRawData C ON C.[Page IDS] = CONVERT(INT, CONVERT(VARBINARY(MAX), REVERSE(SUBSTRING(B.[RowLog Contents 0],27 + 14, 2))))AND C.[File IDS] = CONVERT(INT, CONVERT(VARBINARY(MAX), REVERSE(SUBSTRING(B.[RowLog Contents 0],31 + 14, 2))))AND C.[Link ID] = B.[Link ID]
WHERE   ( A.[RowLog Contents 0] IS NOT NULLOR C.[RowLog Contents 0] IS NOT NULL)UPDATE  B
SET     B.[RowLog Contents 0] = ( CASE WHEN A.[RowLog Contents 0] IS NOT NULLAND C.[RowLog Contents 0] IS NOT NULLTHEN A.[RowLog Contents 0]+ C.[RowLog Contents 0]WHEN A.[RowLog Contents 0] IS NULLAND C.[RowLog Contents 0] IS NOT NULLTHEN C.[RowLog Contents 0]WHEN A.[RowLog Contents 0] IS NOT NULLAND C.[RowLog Contents 0] IS NULLTHEN A.[RowLog Contents 0]END )
--,B.[Update]=ISNULL(B.[Update],0)+1
FROM    @ModifiedRawData BLEFT JOIN @ModifiedRawData A ON A.[Page IDS] = CONVERT(INT, CONVERT(VARBINARY(MAX), REVERSE(SUBSTRING(B.[RowLog Contents 0],15 + 14, 2))))AND A.[File IDS] = CONVERT(INT, CONVERT(VARBINARY(MAX), REVERSE(SUBSTRING(B.[RowLog Contents 0],19 + 14, 2))))AND A.[Link ID] <> B.[Link ID]AND B.[Update] = 0LEFT JOIN @ModifiedRawData C ON C.[Page IDS] = CONVERT(INT, CONVERT(VARBINARY(MAX), REVERSE(SUBSTRING(B.[RowLog Contents 0],27 + 14, 2))))AND C.[File IDS] = CONVERT(INT, CONVERT(VARBINARY(MAX), REVERSE(SUBSTRING(B.[RowLog Contents 0],31 + 14, 2))))AND C.[Link ID] <> B.[Link ID]AND B.[Update] = 0
WHERE   ( A.[RowLog Contents 0] IS NOT NULLOR C.[RowLog Contents 0] IS NOT NULL)UPDATE  @ModifiedRawData
SET     [RowLog Contents 0] = ( CASE WHEN [RowLog Len] >= 8000THEN SUBSTRING([RowLog Contents 0],15, [RowLog Len])WHEN [RowLog Len] < 8000THEN SUBSTRING([RowLog Contents 0],15 + 6,CONVERT(INT, CONVERT(VARBINARY(MAX), REVERSE(SUBSTRING([RowLog Contents 0],15, 6)))))END )
FROM    @ModifiedRawData
WHERE   [LINK ID] = 0UPDATE  @ColumnNameAndData
SET     [hex_Value] = [RowLog Contents 0]
--,A.[Update]=A.[Update]+1
FROM    @ColumnNameAndData AINNER JOIN @ModifiedRawData B ON CONVERT(INT, CONVERT(VARBINARY(MAX), REVERSE(SUBSTRING([hex_value],17, 4)))) = [PAGE IDS]AND CONVERT(INT, SUBSTRING([hex_value],9, 2)) = B.[Link ID]
WHERE   [System_Type_Id] IN ( 99, 167, 175, 231, 239, 241, 165, 98 )AND [Link ID] <> 0 UPDATE  @ColumnNameAndData
SET     [hex_Value] = ( CASE WHEN B.[RowLog Contents 0] IS NOT NULLAND C.[RowLog Contents 0] IS NOT NULLTHEN B.[RowLog Contents 0]+ C.[RowLog Contents 0]WHEN B.[RowLog Contents 0] IS NULLAND C.[RowLog Contents 0] IS NOT NULLTHEN C.[RowLog Contents 0]WHEN B.[RowLog Contents 0] IS NOT NULLAND C.[RowLog Contents 0] IS NULLTHEN B.[RowLog Contents 0]END )
--,A.[Update]=A.[Update]+1
FROM    @ColumnNameAndData ALEFT JOIN @ModifiedRawData B ON CONVERT(INT, CONVERT(VARBINARY(MAX), REVERSE(SUBSTRING([hex_value],5, 4)))) = B.[PAGE IDS]AND B.[Link ID] = 0LEFT JOIN @ModifiedRawData C ON CONVERT(INT, CONVERT(VARBINARY(MAX), REVERSE(SUBSTRING([hex_value],17, 4)))) = C.[PAGE IDS]AND C.[Link ID] = 0
WHERE   [System_Type_Id] IN ( 99, 167, 175, 231, 239, 241, 165, 98 )AND ( B.[RowLog Contents 0] IS NOT NULLOR C.[RowLog Contents 0] IS NOT NULL)UPDATE  @ColumnNameAndData
SET     [hex_Value] = [RowLog Contents 0]
--,A.[Update]=A.[Update]+1
FROM    @ColumnNameAndData AINNER JOIN @ModifiedRawData B ON CONVERT(INT, CONVERT(VARBINARY(MAX), REVERSE(SUBSTRING([hex_value],9, 4)))) = [PAGE IDS]AND CONVERT(INT, SUBSTRING([hex_value],3, 2)) = [Link ID]
WHERE   [System_Type_Id] IN ( 35, 34, 99 )AND [Link ID] <> 0 UPDATE  @ColumnNameAndData
SET     [hex_Value] = [RowLog Contents 0]
--,A.[Update]=A.[Update]+10
FROM    @ColumnNameAndData AINNER JOIN @ModifiedRawData B ON CONVERT(INT, CONVERT(VARBINARY(MAX), REVERSE(SUBSTRING([hex_value],9, 4)))) = [PAGE IDS]
WHERE   [System_Type_Id] IN ( 35, 34, 99 )AND [Link ID] = 0UPDATE  @ColumnNameAndData
SET     [hex_Value] = [RowLog Contents 0]
--,A.[Update]=A.[Update]+1
FROM    @ColumnNameAndData AINNER JOIN @ModifiedRawData B ON CONVERT(INT, CONVERT(VARBINARY(MAX), REVERSE(SUBSTRING([hex_value],15, 4)))) = [PAGE IDS]
WHERE   [System_Type_Id] IN ( 35, 34, 99 )AND [Link ID] = 0UPDATE  @ColumnNameAndData
SET     [hex_value] = 0xFFFE + SUBSTRING([hex_value], 9, LEN([hex_value]))
--,[Update]=[Update]+1
WHERE   [system_type_id] = 241CREATE TABLE [#temp_Data]([FieldName] VARCHAR(MAX) ,[FieldValue] NVARCHAR(MAX) ,[Rowlogcontents] VARBINARY(8000) ,[Row ID] INT)INSERT  INTO #temp_DataSELECT  NAME ,CASE WHEN system_type_id IN ( 231, 239 )THEN LTRIM(RTRIM(CONVERT(NVARCHAR(MAX), hex_Value)))  --NVARCHAR ,NCHARWHEN system_type_id IN ( 167, 175 )THEN LTRIM(RTRIM(CONVERT(VARCHAR(MAX), hex_Value)))  --VARCHAR,CHARWHEN system_type_id IN ( 35 )THEN LTRIM(RTRIM(CONVERT(VARCHAR(MAX), hex_Value))) --TextWHEN system_type_id IN ( 99 )THEN LTRIM(RTRIM(CONVERT(NVARCHAR(MAX), hex_Value))) --nText WHEN system_type_id = 48THEN CONVERT(VARCHAR(MAX), CONVERT(TINYINT, CONVERT(BINARY(1), REVERSE(hex_Value)))) --TINY INTEGERWHEN system_type_id = 52THEN CONVERT(VARCHAR(MAX), CONVERT(SMALLINT, CONVERT(BINARY(2), REVERSE(hex_Value)))) --SMALL INTEGERWHEN system_type_id = 56THEN CONVERT(VARCHAR(MAX), CONVERT(INT, CONVERT(BINARY(4), REVERSE(hex_Value)))) -- INTEGERWHEN system_type_id = 127THEN CONVERT(VARCHAR(MAX), CONVERT(BIGINT, CONVERT(BINARY(8), REVERSE(hex_Value))))-- BIG INTEGERWHEN system_type_id = 61THEN CONVERT(VARCHAR(MAX), CONVERT(DATETIME, CONVERT(VARBINARY(8000), REVERSE(hex_Value))), 100) --DATETIMEWHEN system_type_id = 58THEN CONVERT(VARCHAR(MAX), CONVERT(SMALLDATETIME, CONVERT(VARBINARY(8000), REVERSE(hex_Value))), 100) --SMALL DATETIMEWHEN system_type_id = 108THEN CONVERT(VARCHAR(MAX), CONVERT(NUMERIC(38, 20), CONVERT(VARBINARY, CONVERT(VARBINARY(1), xprec)+ CONVERT(VARBINARY(1), xscale))+ CONVERT(VARBINARY(1), 0) + hex_Value)) --- NUMERICWHEN system_type_id = 106THEN CONVERT(VARCHAR(MAX), CONVERT(DECIMAL(38, 20), CONVERT(VARBINARY, CONVERT(VARBINARY(1), xprec)+ CONVERT(VARBINARY(1), xscale))+ CONVERT(VARBINARY(1), 0) + hex_Value)) --- DECIMALWHEN system_type_id IN ( 60, 122 )THEN CONVERT(VARCHAR(MAX), CONVERT(MONEY, CONVERT(VARBINARY(8000), REVERSE(hex_Value))), 2) --MONEY,SMALLMONEYWHEN system_type_id = 104THEN CONVERT(VARCHAR(MAX), CONVERT (BIT, CONVERT(BINARY(1), hex_Value)% 2))  -- BITWHEN system_type_id = 62THEN RTRIM(LTRIM(STR(CONVERT(FLOAT, SIGN(CAST(CONVERT(VARBINARY(8000), REVERSE(hex_Value)) AS BIGINT))* ( 1.0+ ( CAST(CONVERT(VARBINARY(8000), REVERSE(hex_Value)) AS BIGINT)& 0x000FFFFFFFFFFFFF )* POWER(CAST(2 AS FLOAT),-52) )* POWER(CAST(2 AS FLOAT),( ( CAST(CONVERT(VARBINARY(8000), REVERSE(hex_Value)) AS BIGINT)& 0x7ff0000000000000 )/ EXP(52 * LOG(2))- 1023 ))), 53,LEN(hex_Value)))) --- FLOATWHEN system_type_id = 59THEN LEFT(LTRIM(STR(CAST(SIGN(CAST(CONVERT(VARBINARY(8000), REVERSE(hex_Value)) AS BIGINT))* ( 1.0+ ( CAST(CONVERT(VARBINARY(8000), REVERSE(hex_Value)) AS BIGINT)& 0x007FFFFF )* POWER(CAST(2 AS REAL), -23) )* POWER(CAST(2 AS REAL),( ( ( CAST(CONVERT(VARBINARY(8000), REVERSE(hex_Value)) AS INT) )& 0x7f800000 )/ EXP(23 * LOG(2))- 127 )) AS REAL), 23,23)), 8) --RealWHEN system_type_id IN ( 165, 173 )THEN ( CASE WHEN CHARINDEX(0x,CAST('' AS XML).value('xs:hexBinary(sql:column("hex_Value"))','VARBINARY(8000)')) = 0THEN '0x'ELSE ''END ) + CAST('' AS XML).value('xs:hexBinary(sql:column("hex_Value"))','varchar(max)') -- BINARY,VARBINARYWHEN system_type_id = 34THEN ( CASE WHEN CHARINDEX(0x,CAST('' AS XML).value('xs:hexBinary(sql:column("hex_Value"))','VARBINARY(8000)')) = 0THEN '0x'ELSE ''END ) + CAST('' AS XML).value('xs:hexBinary(sql:column("hex_Value"))','varchar(max)')  --IMAGEWHEN system_type_id = 36THEN CONVERT(VARCHAR(MAX), CONVERT(UNIQUEIDENTIFIER, hex_Value)) --UNIQUEIDENTIFIERWHEN system_type_id = 231THEN CONVERT(VARCHAR(MAX), CONVERT(SYSNAME, hex_Value)) --SYSNAMEWHEN system_type_id = 241THEN CONVERT(VARCHAR(MAX), CONVERT(XML, hex_Value)) --XMLWHEN system_type_id = 189THEN ( CASE WHEN CHARINDEX(0x,CAST('' AS XML).value('xs:hexBinary(sql:column("hex_Value"))','VARBINARY(8000)')) = 0THEN '0x'ELSE ''END ) + CAST('' AS XML).value('xs:hexBinary(sql:column("hex_Value"))','varchar(max)') --TIMESTAMPWHEN system_type_id = 98THEN ( CASE WHEN CONVERT(INT, SUBSTRING(hex_Value, 1,1)) = 56THEN CONVERT(VARCHAR(MAX), CONVERT(INT, CONVERT(BINARY(4), REVERSE(SUBSTRING(hex_Value,3,LEN(hex_Value))))))  -- INTEGERWHEN CONVERT(INT, SUBSTRING(hex_Value, 1,1)) = 108THEN CONVERT(VARCHAR(MAX), CONVERT(NUMERIC(38,20), CONVERT(VARBINARY(1), SUBSTRING(hex_Value,3, 1))+ CONVERT(VARBINARY(1), SUBSTRING(hex_Value,4, 1))+ CONVERT(VARBINARY(1), 0)+ SUBSTRING(hex_Value, 5,LEN(hex_Value)))) --- NUMERICWHEN CONVERT(INT, SUBSTRING(hex_Value, 1,1)) = 167THEN LTRIM(RTRIM(CONVERT(VARCHAR(MAX), SUBSTRING(hex_Value,9,LEN(hex_Value))))) --VARCHAR,CHARWHEN CONVERT(INT, SUBSTRING(hex_Value, 1,1)) = 36THEN CONVERT(VARCHAR(MAX), CONVERT(UNIQUEIDENTIFIER, SUBSTRING(( hex_Value ),3, 20))) --UNIQUEIDENTIFIERWHEN CONVERT(INT, SUBSTRING(hex_Value, 1,1)) = 61THEN CONVERT(VARCHAR(MAX), CONVERT(DATETIME, CONVERT(VARBINARY(8000), REVERSE(SUBSTRING(hex_Value,3,LEN(hex_Value))))), 100) --DATETIMEWHEN CONVERT(INT, SUBSTRING(hex_Value, 1,1)) = 165THEN '0x'+ SUBSTRING(( CASE WHEN CHARINDEX(0x,CAST('' AS XML).value('xs:hexBinary(sql:column("hex_Value"))','VARBINARY(8000)')) = 0THEN '0x'ELSE ''END )+ CAST('' AS XML).value('xs:hexBinary(sql:column("hex_Value"))','varchar(max)'),11, LEN(hex_Value)) -- BINARY,VARBINARYEND )END AS FieldValue ,[Rowlogcontents] ,[Row ID]FROM    @ColumnNameAndDataORDER BY nullbit

–Create the column name in the same order to do pivot table.

DECLARE @FieldName VARCHAR(MAX)
SET @FieldName = STUFF(( SELECT ','+ CAST(QUOTENAME([Name]) AS VARCHAR(MAX))FROM   syscolumnsWHERE  id = OBJECT_ID(''+ @SchemaName_n_TableName+ '')FORXML PATH('')), 1, 1, '')

–Finally did pivot table and get the data back in the same format.

SET @sql = 'SELECT ' + @FieldName+ ' FROM #temp_Data PIVOT (Min([FieldValue]) FOR FieldName IN ('+ @FieldName + ')) AS pvt'
EXEC sp_executesql @sql

GO

执行存储过程

--恢复数据,不加时间段条件  参数:数据库名,表名
--EXAMPLE #1 : FOR ALL DELETED RECORDS
EXEC Recover_Deleted_Data_Proc 'test','dbo.aa'
GO--恢复数据,加时间段条件
--EXAMPLE #2 : FOR ANY SPECIFIC DATE RANGE
EXEC Recover_Deleted_Data_Proc 'test','dbo.aa','2014-04-23','2014-04-23'

公司数据库使用的是sqlServer 以防万一留着 SQLsever误删数据恢复相关推荐

  1. XX公司数据库迁移项目可行性研究与风险评估

    XX公司数据库迁移项目可行性研究与风险评估 请尊重知识,请尊重原创 更多资料参考请见  http://www.cezuwang.com/listFilm?page=1&areaId=906&a ...

  2. 数据库的移动 1007 sqlserver

    数据库的移动 1007 sqlserver 数据库的复制 >需求 将一台计算机上的数据库内容 复制到 另一台计算机上面 >办法 分离 附加 分离 >什么是分离 清除本机的逻辑数据 保 ...

  3. 从删库到跑路,就是这么迅速!程序员为了报复同事删了公司数据库

    从删库到跑路,就是这么迅速!程序员为了报复同事删了公司数据库 一只有头发的程序猿 2019-08-23 09:38 做过互联网行业的都知道,数据库对公司是至关重要的,存储了大量的数据在里面,要是没有这 ...

  4. 创建数据库失败((Microsoft.SqlServer.Smo))执行Transact-SQL语句或批处理时发生了异常。

    创建数据库失败((Microsoft.SqlServer.Smo))执行Transact-SQL语句或批处理时发生了异常. 参考文章: (1)创建数据库失败((Microsoft.SqlServer. ...

  5. pymssql mysql_Python数据库模块pymssql连接SQLServer数据库操作详解

    Python数据库模块pymssql连接SQLServer数据库操作详解 发布时间:2018-08-23 19:32, 浏览次数:720 , 标签: Python pymssql SQLServer ...

  6. 记一次在家办公远程公司数据库的解决方案

    记一次在家办公远程公司数据库的解决方案 参考文章: (1)记一次在家办公远程公司数据库的解决方案 (2)https://www.cnblogs.com/jkguo/p/11188706.html 备忘 ...

  7. 使用 SQL 创建公司数据库的最快方法

    公司有自己的数据库,其中包括他们的销售人数.员工人数.客户人数等.企业和其他组织使用 SQL 程序来访问和操作数据库中的信息和数据,以及创建和更改新表. 在这里,我们将学习如何使用 MySQL 模式创 ...

  8. SqlServer无备份下误删数据恢复

    系统已上线,给客户修改bug的时候,使用delete语句删表数据,没想到库没切换成测试库.误删了正式库的数据,而且一次备份都没有做过,玩大了 不扯了,进入主题 网上很多方法,都是针对至少有一次备份的情 ...

  9. 主要的数据库Oracle\mysql\DB2\SQLServer\Sybase\SQLite

    数据库主要有: mysql mysql是一个关系型数据库管理系统,由MySQLAB公司开发,现属于Oracle旗下产品.优点是:开源.免费,常用于web方面 Oracle Oracle是美国Oracl ...

最新文章

  1. Java虚拟机监控指标及监控配置
  2. FB壕掷千万办换脸视频检测挑战赛,网友:这是帮Deepfake训练鉴别器吗?
  3. 2021-01-27 计算机-进程与线程区别
  4. 四则运算2的单元测试
  5. ECS 按量付费VPC实例停机不收费FAQ
  6. C/C++ ltoa函数 - C语言零基础入门教程
  7. 升级过log4j,却还没搞懂log4j漏洞的本质?
  8. python 表白程序代码_python抖音表白程序源代码
  9. java加载阶段内存分配_Java核心:类加载和JVM内存的分配
  10. mouseenter 事件
  11. 正则表达式匹配多字符(二)
  12. 【SQL】用SQL语句表示同比和环比
  13. web前端vue项目完整步骤。pc端
  14. oracle append parallel,大量数据快速插入方法探究[nologging+parallel+append]
  15. 【论文复现】ARBITRAR : User-Guided API Misuse Detectionl
  16. P1526 [NOI2003] 智破连环阵 题解
  17. 《神经科学:探索脑》学习笔记(第2章 神经元和神经胶质细胞)
  18. Office2016的安装进度在 90% 时挂起
  19. 第一节 java数据类型
  20. JavaScript面向对象(上)

热门文章

  1. Linux SSH登录被拒绝:Server refused our key
  2. 平方求和、立方求和公式
  3. 设置卡巴斯基2010升级服务器,防止拉入黑名单
  4. Error: IMA Service Error Message -2147483647 群里解决问题收集的 (一飞出品)
  5. java电脑类_计算机类在Java中的设计于实现码
  6. Oracle 10g R2 Student PPTs
  7. 瑞萨单片USB设备使用
  8. VRTK4开发VR2:射线
  9. 发多少范德萨范德萨范德萨范德萨
  10. 静态Html/css+html制作用户 协议书模板/请帖模板