当前位置:Gxlcms > mysql > 恢复SQLSERVER被误删除的数据

恢复SQLSERVER被误删除的数据

时间:2021-07-01 10:21:17 帮助过:12人阅读

恢复SQLSERVER被误删除的数据 曾经想实现Log Explorer for SQL Server的功能,利用ldf里面的日志来还原误删除的数据 这里有一篇文章做到了,不过似乎不是所有的数据类型都支持 以下为译文: http://raresql.com/2011/10/22/how-to-recover-deleted-data-from

恢复SQLSERVER被误删除的数据

曾经想实现Log Explorer for SQL Server的功能,利用ldf里面的日志来还原误删除的数据

这里有一篇文章做到了,不过似乎不是所有的数据类型都支持

以下为译文:http://raresql.com/2011/10/22/how-to-recover-deleted-data-from-sql-sever/

在我使用SQLSERVER的这些年里面,大部分人都会问我一个问题:“能不能恢复被删除的数据??”

现在,从SQLSERVER2005 或以上版本能很容易能够恢复被删除的数据

(注意:这个脚本能恢复下面的数据类型的数据 而且兼容CS 排序规则)

  • image
  • text
  • uniqueidentifier
  • tinyint
  • smallint
  • int
  • smalldatetime
  • real
  • money
  • datetime
  • float
  • sql_variant
  • ntext
  • bit
  • decimal
  • numeric
  • smallmoney
  • bigint
  • varbinary
  • varchar
  • binary
  • char
  • timestamp
  • nvarchar
  • nchar
  • xml
  • sysname

让我来用demo来解释一下我是怎么做到的

  1. <span>USE</span><span> master
  2. </span><span>GO</span>
  3. <span>--</span><span>创建数据库</span>
  4. <span>CREATE</span> <span>DATABASE</span><span> test
  5. </span><span>GO</span>
  6. <span>USE</span> <span>[</span><span>test</span><span>]</span>
  7. <span>GO</span>
  8. <span>--</span><span>创建表</span>
  9. <span>CREATE</span> <span>TABLE</span> <span>[</span><span>dbo</span><span>]</span>.<span>[</span><span>aa</span><span>]</span><span>(
  10. </span><span>[</span><span>id</span><span>]</span> <span>[</span><span>int</span><span>]</span> <span>IDENTITY</span>(<span>1</span>,<span>1</span>) <span>NOT</span> <span>NULL</span><span>,
  11. </span><span>[</span><span>NAME</span><span>]</span> <span>[</span><span>nvarchar</span><span>]</span>(<span>200</span>) <span>NULL</span><span>
  12. ) </span><span>ON</span> <span>[</span><span>PRIMARY</span><span>]</span>
  13. <span>GO</span>
  14. <span>--</span><span>插入测试数据</span>
  15. <span>INSERT</span> <span>[</span><span>dbo</span><span>]</span>.<span>[</span><span>aa</span><span>]</span><span>
  16. ( </span><span>[</span><span>NAME</span><span>]</span><span> )
  17. </span><span>SELECT</span> <span>'</span><span>你好</span><span>'</span>
  18. <span>GO</span>
  19. <span>--</span><span>删除数据</span>
  20. <span>Delete</span> <span>from</span><span> aa
  21. </span><span>Go</span>
  22. <span>--</span><span>验证数据是否已经删除</span>
  23. <span>Select</span> <span>*</span> <span>from</span><span> aa
  24. </span><span>Go</span>

现在你需要创建一个存储过程来恢复你的数据

  1. <span>--</span><span> Script Name: Recover_Deleted_Data_Proc</span><span>
  2. --</span><span> Script Type : Recovery Procedure </span><span>
  3. --</span><span> Develop By: Muhammad Imran</span><span>
  4. --</span><span> Date Created: 15 Oct 2011</span><span>
  5. --</span><span> Modify Date: 22 Aug 2012</span><span>
  6. --</span><span> Version : 3.1</span><span>
  7. --</span><span> Notes : Included BLOB data types for recovery.& Compatibile with Default , CS collation , Arabic_CI_AS.</span>
  8. <span>CREATE</span> <span>PROCEDURE</span><span> Recover_Deleted_Data_Proc
  9. </span><span>@Database_Name</span> <span>NVARCHAR</span>(<span>MAX</span><span>) ,
  10. </span><span>@SchemaName_n_TableName</span> <span>NVARCHAR</span>(<span>MAX</span><span>) ,
  11. </span><span>@Date_From</span> <span>DATETIME</span> <span>=</span> <span>'</span><span>1900/01/01</span><span>'</span><span> ,
  12. </span><span>@Date_To</span> <span>DATETIME</span> <span>=</span> <span>'</span><span>9999/12/31</span><span>'</span>
  13. <span>AS</span>
  14. <span>DECLARE</span> <span>@RowLogContents</span> <span>VARBINARY</span>(<span>8000</span><span>)
  15. </span><span>DECLARE</span> <span>@TransactionID</span> <span>NVARCHAR</span>(<span>MAX</span><span>)
  16. </span><span>DECLARE</span> <span>@AllocUnitID</span> <span>BIGINT</span>
  17. <span>DECLARE</span> <span>@AllocUnitName</span> <span>NVARCHAR</span>(<span>MAX</span><span>)
  18. </span><span>DECLARE</span> <span>@SQL</span> <span>NVARCHAR</span>(<span>MAX</span><span>)
  19. </span><span>DECLARE</span> <span>@Compatibility_Level</span> <span>INT</span>
  20. <span>SELECT</span> <span>@Compatibility_Level</span> <span>=</span><span> dtb.compatibility_level
  21. </span><span>FROM</span> master.sys.databases <span>AS</span><span> dtb
  22. </span><span>WHERE</span> dtb.name <span>=</span> <span>@Database_Name</span>
  23. <span>IF</span> <span>ISNULL</span>(<span>@Compatibility_Level</span>, <span>0</span>) <span><=</span> <span>80</span>
  24. <span>BEGIN</span>
  25. <span>RAISERROR</span>(<span>'</span><span>The compatibility level should be equal to or greater SQL SERVER 2005 (90)</span><span>'</span>,<span>16</span>,<span>1</span><span>)
  26. </span><span>RETURN</span>
  27. <span>END</span>
  28. <span>IF</span> ( <span>SELECT</span> <span>COUNT</span>(<span>*</span><span>)
  29. </span><span>FROM</span><span> INFORMATION_SCHEMA.TABLES
  30. </span><span>WHERE</span> <span>[</span><span>TABLE_SCHEMA</span><span>]</span> <span>+</span> <span>'</span><span>.</span><span>'</span> <span>+</span> <span>[</span><span>TABLE_NAME</span><span>]</span> <span>=</span> <span>@SchemaName_n_TableName</span><span>
  31. ) </span><span>=</span> <span>0</span>
  32. <span>BEGIN</span>
  33. <span>RAISERROR</span>(<span>'</span><span>Could not found the table in the defined database</span><span>'</span>,<span>16</span>,<span>1</span><span>)
  34. </span><span>RETURN</span>
  35. <span>END</span>
  36. <span>DECLARE</span> <span>@bitTable</span> <span>TABLE</span><span>
  37. (
  38. </span><span>[</span><span>ID</span><span>]</span> <span>INT</span><span> ,
  39. </span><span>[</span><span>Bitvalue</span><span>]</span> <span>INT</span><span>
  40. )
  41. </span><span>--</span><span>Create table to set the bit position of one byte.</span>
  42. <span>INSERT</span> <span>INTO</span> <span>@bitTable</span>
  43. <span>SELECT</span> <span>0</span><span> ,
  44. </span><span>2</span>
  45. <span>UNION</span> <span>ALL</span>
  46. <span>SELECT</span> <span>1</span><span> ,
  47. </span><span>2</span>
  48. <span>UNION</span> <span>ALL</span>
  49. <span>SELECT</span> <span>2</span><span> ,
  50. </span><span>4</span>
  51. <span>UNION</span> <span>ALL</span>
  52. <span>SELECT</span> <span>3</span><span> ,
  53. </span><span>8</span>
  54. <span>UNION</span> <span>ALL</span>
  55. <span>SELECT</span> <span>4</span><span> ,
  56. </span><span>16</span>
  57. <span>UNION</span> <span>ALL</span>
  58. <span>SELECT</span> <span>5</span><span> ,
  59. </span><span>32</span>
  60. <span>UNION</span> <span>ALL</span>
  61. <span>SELECT</span> <span>6</span><span> ,
  62. </span><span>64</span>
  63. <span>UNION</span> <span>ALL</span>
  64. <span>SELECT</span> <span>7</span><span> ,
  65. </span><span>128</span>
  66. <span>--</span><span>Create table to collect the row data.</span>
  67. <span>DECLARE</span> <span>@DeletedRecords</span> <span>TABLE</span><span>
  68. (
  69. </span><span>[</span><span>Row ID</span><span>]</span> <span>INT</span> <span>IDENTITY</span>(<span>1</span>, <span>1</span><span>) ,
  70. </span><span>[</span><span>RowLogContents</span><span>]</span> <span>VARBINARY</span>(<span>8000</span><span>) ,
  71. </span><span>[</span><span>AllocUnitID</span><span>]</span> <span>BIGINT</span><span> ,
  72. </span><span>[</span><span>Transaction ID</span><span>]</span> <span>NVARCHAR</span>(<span>MAX</span><span>) ,
  73. </span><span>[</span><span>FixedLengthData</span><span>]</span> <span>SMALLINT</span><span> ,
  74. </span><span>[</span><span>TotalNoOfCols</span><span>]</span> <span>SMALLINT</span><span> ,
  75. </span><span>[</span><span>NullBitMapLength</span><span>]</span> <span>SMALLINT</span><span> ,
  76. </span><span>[</span><span>NullBytes</span><span>]</span> <span>VARBINARY</span>(<span>8000</span><span>) ,
  77. </span><span>[</span><span>TotalNoofVarCols</span><span>]</span> <span>SMALLINT</span><span> ,
  78. </span><span>[</span><span>ColumnOffsetArray</span><span>]</span> <span>VARBINARY</span>(<span>8000</span><span>) ,
  79. </span><span>[</span><span>VarColumnStart</span><span>]</span> <span>SMALLINT</span><span> ,
  80. </span><span>[</span><span>Slot ID</span><span>]</span> <span>INT</span><span> ,
  81. </span><span>[</span><span>NullBitMap</span><span>]</span> <span>VARCHAR</span>(<span>MAX</span><span>)
  82. )
  83. </span><span>--</span><span>Create a common table expression to get all the row data plus how many bytes we have for each row.</span>
  84. <span>;
  85. </span><span>WITH</span><span> RowData
  86. </span><span>AS</span> ( <span>SELECT</span> <span>[</span><span>RowLog Contents 0</span><span>]</span> <span>AS</span> <span>[</span><span>RowLogContents</span><span>]</span><span> ,
  87. </span><span>[</span><span>AllocUnitID</span><span>]</span> <span>AS</span> <span>[</span><span>AllocUnitID</span><span>]</span><span> ,
  88. </span><span>[</span><span>Transaction ID</span><span>]</span> <span>AS</span> <span>[</span><span>Transaction ID</span><span>]</span>
  89. <span>--</span><span>[Fixed Length Data] = Substring (RowLog content 0, Status Bit A+ Status Bit B + 1,2 bytes)</span>
  90. <span> ,
  91. </span><span>CONVERT</span>(<span>SMALLINT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  92. </span><span>2</span> <span>+</span> <span>1</span>, <span>2</span>)))) <span>AS</span> <span>[</span><span>FixedLengthData</span><span>]</span> <span>--</span><span>@FixedLengthData</span>
  93. <span>--</span><span> [TotalnoOfCols] = Substring (RowLog content 0, [Fixed Length Data] + 1,2 bytes)</span>
  94. <span> ,
  95. </span><span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  96. </span><span>CONVERT</span>(<span>SMALLINT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  97. </span><span>2</span> <span>+</span> <span>1</span>, <span>2</span>)))) <span>+</span> <span>1</span><span>,
  98. </span><span>2</span>)))) <span>AS</span> <span>[</span><span>TotalNoOfCols</span><span>]</span>
  99. <span>--</span><span>[NullBitMapLength]=ceiling([Total No of Columns] /8.0)</span>
  100. <span> ,
  101. </span><span>CONVERT</span>(<span>INT</span>, <span>CEILING</span>(<span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  102. </span><span>CONVERT</span>(<span>SMALLINT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  103. </span><span>2</span> <span>+</span> <span>1</span>, <span>2</span>)))) <span>+</span> <span>1</span><span>,
  104. </span><span>2</span>)))) <span>/</span> <span>8.0</span>)) <span>AS</span> <span>[</span><span>NullBitMapLength</span><span>]</span>
  105. <span>--</span><span>[Null Bytes] = Substring (RowLog content 0, Status Bit A+ Status Bit B + [Fixed Length Data] +1, [NullBitMapLength] )</span>
  106. <span> ,
  107. </span><span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  108. </span><span>CONVERT</span>(<span>SMALLINT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  109. </span><span>2</span> <span>+</span> <span>1</span>, <span>2</span>)))) <span>+</span> <span>3</span><span>,
  110. </span><span>CONVERT</span>(<span>INT</span>, <span>CEILING</span>(<span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  111. </span><span>CONVERT</span>(<span>SMALLINT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  112. </span><span>2</span> <span>+</span> <span>1</span>, <span>2</span>)))) <span>+</span> <span>1</span><span>,
  113. </span><span>2</span>)))) <span>/</span> <span>8.0</span>))) <span>AS</span> <span>[</span><span>NullBytes</span><span>]</span>
  114. <span>--</span><span>[TotalNoofVarCols] = Substring (RowLog content 0, Status Bit A+ Status Bit B + [Fixed Length Data] +1, [Null Bitmap length] + 2 )</span>
  115. <span> ,
  116. ( </span><span>CASE</span> <span>WHEN</span> <span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span>, <span>1</span>, <span>1</span>) <span>IN</span><span> (
  117. </span><span>0x10</span>, <span>0x30</span>, <span>0x70</span><span> )
  118. </span><span>THEN</span> <span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  119. </span><span>CONVERT</span>(<span>SMALLINT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  120. </span><span>2</span> <span>+</span> <span>1</span>, <span>2</span>)))) <span>+</span> <span>3</span>
  121. <span>+</span> <span>CONVERT</span>(<span>INT</span>, <span>CEILING</span>(<span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  122. </span><span>CONVERT</span>(<span>SMALLINT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  123. </span><span>2</span> <span>+</span> <span>1</span>, <span>2</span>)))) <span>+</span> <span>1</span><span>,
  124. </span><span>2</span>)))) <span>/</span> <span>8.0</span>)), <span>2</span><span>))))
  125. </span><span>ELSE</span> <span>NULL</span>
  126. <span>END</span> ) <span>AS</span> <span>[</span><span>TotalNoofVarCols</span><span>]</span>
  127. <span>--</span><span>[ColumnOffsetArray]= Substring (RowLog content 0, Status Bit A+ Status Bit B + [Fixed Length Data] +1, [Null Bitmap length] + 2 , [TotalNoofVarCols]*2 )</span>
  128. <span> ,
  129. ( </span><span>CASE</span> <span>WHEN</span> <span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span>, <span>1</span>, <span>1</span>) <span>IN</span><span> (
  130. </span><span>0x10</span>, <span>0x30</span>, <span>0x70</span><span> )
  131. </span><span>THEN</span> <span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  132. </span><span>CONVERT</span>(<span>SMALLINT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  133. </span><span>2</span> <span>+</span> <span>1</span>, <span>2</span>)))) <span>+</span> <span>3</span>
  134. <span>+</span> <span>CONVERT</span>(<span>INT</span>, <span>CEILING</span>(<span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  135. </span><span>CONVERT</span>(<span>SMALLINT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  136. </span><span>2</span> <span>+</span> <span>1</span>, <span>2</span>)))) <span>+</span> <span>1</span><span>,
  137. </span><span>2</span>)))) <span>/</span> <span>8.0</span><span>))
  138. </span><span>+</span> <span>2</span><span>,
  139. ( </span><span>CASE</span> <span>WHEN</span> <span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  140. </span><span>1</span>, <span>1</span>) <span>IN</span> ( <span>0x10</span><span>,
  141. </span><span>0x30</span>, <span>0x70</span><span> )
  142. </span><span>THEN</span> <span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  143. </span><span>CONVERT</span>(<span>SMALLINT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  144. </span><span>2</span> <span>+</span> <span>1</span>, <span>2</span>)))) <span>+</span> <span>3</span>
  145. <span>+</span> <span>CONVERT</span>(<span>INT</span>, <span>CEILING</span>(<span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  146. </span><span>CONVERT</span>(<span>SMALLINT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  147. </span><span>2</span> <span>+</span> <span>1</span>, <span>2</span>)))) <span>+</span> <span>1</span><span>,
  148. </span><span>2</span>)))) <span>/</span> <span>8.0</span>)), <span>2</span><span>))))
  149. </span><span>ELSE</span> <span>NULL</span>
  150. <span>END</span> ) <span>*</span> <span>2</span><span>)
  151. </span><span>ELSE</span> <span>NULL</span>
  152. <span>END</span> ) <span>AS</span> <span>[</span><span>ColumnOffsetArray</span><span>]</span>
  153. <span>--</span><span> Variable column Start = Status Bit A+ Status Bit B + [Fixed Length Data] + [Null Bitmap length] + 2+([TotalNoofVarCols]*2)</span>
  154. <span> ,
  155. </span><span>CASE</span> <span>WHEN</span> <span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span>, <span>1</span>, <span>1</span>) <span>IN</span><span> (
  156. </span><span>0x10</span>, <span>0x30</span>, <span>0x70</span><span> )
  157. </span><span>THEN</span> ( <span>CONVERT</span>(<span>SMALLINT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  158. </span><span>2</span> <span>+</span> <span>1</span>, <span>2</span>)))) <span>+</span> <span>4</span>
  159. <span>+</span> <span>CONVERT</span>(<span>INT</span>, <span>CEILING</span>(<span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  160. </span><span>CONVERT</span>(<span>SMALLINT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  161. </span><span>2</span> <span>+</span> <span>1</span>, <span>2</span>)))) <span>+</span> <span>1</span><span>,
  162. </span><span>2</span>)))) <span>/</span> <span>8.0</span><span>))
  163. </span><span>+</span> ( ( <span>CASE</span> <span>WHEN</span> <span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  164. </span><span>1</span>, <span>1</span>) <span>IN</span> ( <span>0x10</span><span>,
  165. </span><span>0x30</span>, <span>0x70</span><span> )
  166. </span><span>THEN</span> <span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  167. </span><span>CONVERT</span>(<span>SMALLINT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  168. </span><span>2</span> <span>+</span> <span>1</span>, <span>2</span>)))) <span>+</span> <span>3</span>
  169. <span>+</span> <span>CONVERT</span>(<span>INT</span>, <span>CEILING</span>(<span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  170. </span><span>CONVERT</span>(<span>SMALLINT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span><span>,
  171. </span><span>2</span> <span>+</span> <span>1</span>, <span>2</span>)))) <span>+</span> <span>1</span><span>,
  172. </span><span>2</span>)))) <span>/</span> <span>8.0</span>)), <span>2</span><span>))))
  173. </span><span>ELSE</span> <span>NULL</span>
  174. <span>END</span> ) <span>*</span> <span>2</span><span> ) )
  175. </span><span>ELSE</span> <span>NULL</span>
  176. <span>END</span> <span>AS</span> <span>[</span><span>VarColumnStart</span><span>]</span><span> ,
  177. </span><span>[</span><span>Slot ID</span><span>]</span>
  178. <span>FROM</span> sys.fn_dblog(<span>NULL</span>, <span>NULL</span><span>)
  179. </span><span>WHERE</span> AllocUnitId <span>IN</span><span> (
  180. </span><span>SELECT</span> <span>[</span><span>Allocation_unit_id</span><span>]</span>
  181. <span>FROM</span><span> sys.allocation_units allocunits
  182. </span><span>INNER</span> <span>JOIN</span> sys.partitions partitions <span>ON</span> ( allocunits.type <span>IN</span><span> (
  183. </span><span>1</span>, <span>3</span><span> )
  184. </span><span>AND</span> partitions.hobt_id <span>=</span><span> allocunits.container_id
  185. )
  186. </span><span>OR</span> ( allocunits.type <span>=</span> <span>2</span>
  187. <span>AND</span> partitions.partition_id <span>=</span><span> allocunits.container_id
  188. )
  189. </span><span>WHERE</span> <span>object_id</span> <span>=</span> <span>OBJECT_ID</span>(<span>''</span>
  190. <span>+</span> <span>@SchemaName_n_TableName</span>
  191. <span>+</span> <span>''</span><span>) )
  192. </span><span>AND</span> Context <span>IN</span> ( <span>'</span><span>LCX_MARK_AS_GHOST</span><span>'</span>, <span>'</span><span>LCX_HEAP</span><span>'</span><span> )
  193. </span><span>AND</span> Operation <span>IN</span> ( <span>'</span><span>LOP_DELETE_ROWS</span><span>'</span><span> )
  194. </span><span>AND</span> <span>SUBSTRING</span>(<span>[</span><span>RowLog Contents 0</span><span>]</span>, <span>1</span>, <span>1</span>) <span>IN</span> ( <span>0x10</span><span>,
  195. </span><span>0x30</span>, <span>0x70</span><span> )
  196. </span><span>/*</span><span>Use this subquery to filter the date</span><span>*/</span>
  197. <span>AND</span> <span>[</span><span>TRANSACTION ID</span><span>]</span> <span>IN</span><span> (
  198. </span><span>SELECT</span> <span>DISTINCT</span>
  199. <span>[</span><span>TRANSACTION ID</span><span>]</span>
  200. <span>FROM</span> sys.fn_dblog(<span>NULL</span>, <span>NULL</span><span>)
  201. </span><span>WHERE</span> Context <span>IN</span> ( <span>'</span><span>LCX_NULL</span><span>'</span><span> )
  202. </span><span>AND</span> Operation <span>IN</span> ( <span>'</span><span>LOP_BEGIN_XACT</span><span>'</span><span> )
  203. </span><span>AND</span> <span>[</span><span>Transaction Name</span><span>]</span> <span>IN</span> ( <span>'</span><span>DELETE</span><span>'</span><span>,
  204. </span><span>'</span><span>user_transaction</span><span>'</span><span> )
  205. </span><span>AND</span> <span>CONVERT</span>(<span>NVARCHAR</span>(<span>11</span>), <span>[</span><span>Begin Time</span><span>]</span>) <span>BETWEEN</span> <span>@Date_From</span>
  206. <span>AND</span>
  207. <span>@Date_To</span><span> )
  208. ),
  209. </span><span>--</span><span>Use this technique to repeate the row till the no of bytes of the row.</span>
  210. <span> N1 ( n )
  211. </span><span>AS</span> ( <span>SELECT</span> <span>1</span>
  212. <span>UNION</span> <span>ALL</span>
  213. <span>SELECT</span> <span>1</span><span>
  214. ),
  215. N2 ( n )
  216. </span><span>AS</span> ( <span>SELECT</span> <span>1</span>
  217. <span>FROM</span> N1 <span>AS</span><span> X ,
  218. N1 </span><span>AS</span><span> Y
  219. ),
  220. N3 ( n )
  221. </span><span>AS</span> ( <span>SELECT</span> <span>1</span>
  222. <span>FROM</span> N2 <span>AS</span><span> X ,
  223. N2 </span><span>AS</span><span> Y
  224. ),
  225. N4 ( n )
  226. </span><span>AS</span> ( <span>SELECT</span> ROW_NUMBER() <span>OVER</span> ( <span>ORDER</span> <span>BY</span><span> X.n )
  227. </span><span>FROM</span> N3 <span>AS</span><span> X ,
  228. N3 </span><span>AS</span><span> Y
  229. )
  230. </span><span>INSERT</span> <span>INTO</span> <span>@DeletedRecords</span>
  231. <span>SELECT</span><span> RowLogContents ,
  232. </span><span>[</span><span>AllocUnitID</span><span>]</span><span> ,
  233. </span><span>[</span><span>Transaction ID</span><span>]</span><span> ,
  234. </span><span>[</span><span>FixedLengthData</span><span>]</span><span> ,
  235. </span><span>[</span><span>TotalNoOfCols</span><span>]</span><span> ,
  236. </span><span>[</span><span>NullBitMapLength</span><span>]</span><span> ,
  237. </span><span>[</span><span>NullBytes</span><span>]</span><span> ,
  238. </span><span>[</span><span>TotalNoofVarCols</span><span>]</span><span> ,
  239. </span><span>[</span><span>ColumnOffsetArray</span><span>]</span><span> ,
  240. </span><span>[</span><span>VarColumnStart</span><span>]</span><span> ,
  241. </span><span>[</span><span>Slot ID</span><span>]</span>
  242. <span>--</span><span>-Get the Null value against each column (1 means null zero means not null)</span>
  243. <span> ,
  244. </span><span>[</span><span>NullBitMap</span><span>]</span> <span>=</span> ( <span>REPLACE</span>(<span>STUFF</span>(( <span>SELECT</span>
  245. <span>'</span><span>,</span><span>'</span>
  246. <span>+</span> ( <span>CASE</span>
  247. <span>WHEN</span> <span>[</span><span>ID</span><span>]</span> <span>=</span> <span>0</span>
  248. <span>THEN</span> <span>CONVERT</span>(<span>NVARCHAR</span>(<span>1</span>), ( <span>SUBSTRING</span><span>(NullBytes,
  249. n, </span><span>1</span>) <span>%</span> <span>2</span><span> ))
  250. </span><span>ELSE</span> <span>CONVERT</span>(<span>NVARCHAR</span>(<span>1</span>), ( ( <span>SUBSTRING</span><span>(NullBytes,
  251. n, </span><span>1</span><span>)
  252. </span><span>/</span> <span>[</span><span>Bitvalue</span><span>]</span><span> )
  253. </span><span>%</span> <span>2</span><span> ))
  254. </span><span>END</span> ) <span>--</span><span>as [nullBitMap]</span>
  255. <span>FROM</span> N4 <span>AS</span><span> Nums
  256. </span><span>JOIN</span> RowData <span>AS</span> C <span>ON</span> n <span><=</span><span> NullBitMapLength
  257. </span><span>CROSS</span> <span>JOIN</span> <span>@bitTable</span>
  258. <span>WHERE</span><span>
  259. C.</span><span>[</span><span>RowLogContents</span><span>]</span> <span>=</span> D.<span>[</span><span>RowLogContents</span><span>]</span>
  260. <span>ORDER</span> <span>BY</span> <span>[</span><span>RowLogContents</span><span>]</span><span> ,
  261. n </span><span>ASC</span>
  262. <span>FOR</span><span>
  263. XML PATH(</span><span>''</span><span>)
  264. ), </span><span>1</span>, <span>1</span>, <span>''</span>), <span>'</span><span>,</span><span>'</span>, <span>''</span><span>) )
  265. </span><span>FROM</span><span> RowData D
  266. </span><span>IF</span> ( <span>SELECT</span> <span>COUNT</span>(<span>*</span><span>)
  267. </span><span>FROM</span> <span>@DeletedRecords</span><span>
  268. ) </span><span>=</span> <span>0</span>
  269. <span>BEGIN</span>
  270. <span>RAISERROR</span>(<span>'</span><span>There is no data in the log as per the search criteria</span><span>'</span>,<span>16</span>,<span>1</span><span>)
  271. </span><span>RETURN</span>
  272. <span>END</span>
  273. <span>DECLARE</span> <span>@ColumnNameAndData</span> <span>TABLE</span><span>
  274. (
  275. </span><span>[</span><span>Row ID</span><span>]</span> <span>INT</span><span> ,
  276. </span><span>[</span><span>Rowlogcontents</span><span>]</span> <span>VARBINARY</span>(<span>MAX</span><span>) ,
  277. </span><span>[</span><span>NAME</span><span>]</span><span> SYSNAME ,
  278. </span><span>[</span><span>nullbit</span><span>]</span> <span>SMALLINT</span><span> ,
  279. </span><span>[</span><span>leaf_offset</span><span>]</span> <span>SMALLINT</span><span> ,
  280. </span><span>[</span><span>length</span><span>]</span> <span>SMALLINT</span><span> ,
  281. </span><span>[</span><span>system_type_id</span><span>]</span> <span>TINYINT</span><span> ,
  282. </span><span>[</span><span>bitpos</span><span>]</span> <span>TINYINT</span><span> ,
  283. </span><span>[</span><span>xprec</span><span>]</span> <span>TINYINT</span><span> ,
  284. </span><span>[</span><span>xscale</span><span>]</span> <span>TINYINT</span><span> ,
  285. </span><span>[</span><span>is_null</span><span>]</span> <span>INT</span><span> ,
  286. </span><span>[</span><span>Column value Size</span><span>]</span> <span>INT</span><span> ,
  287. </span><span>[</span><span>Column Length</span><span>]</span> <span>INT</span><span> ,
  288. </span><span>[</span><span>hex_Value</span><span>]</span> <span>VARBINARY</span>(<span>MAX</span><span>) ,
  289. </span><span>[</span><span>Slot ID</span><span>]</span> <span>INT</span><span> ,
  290. </span><span>[</span><span>Update</span><span>]</span> <span>INT</span><span>
  291. )
  292. </span><span>--</span><span>Create common table expression and join it with the rowdata table</span><span>
  293. --</span><span> to get each column details</span><span>
  294. /*</span><span>This part is for variable data columns</span><span>*/</span>
  295. <span>--</span><span>@RowLogContents, </span><span>
  296. --</span><span>(col.columnOffValue - col.columnLength) + 1,</span><span>
  297. --</span><span>col.columnLength</span><span>
  298. --</span><span>)</span>
  299. <span>INSERT</span> <span>INTO</span> <span>@ColumnNameAndData</span>
  300. <span>SELECT</span> <span>[</span><span>Row ID</span><span>]</span><span> ,
  301. Rowlogcontents ,
  302. NAME ,
  303. cols.leaf_null_bit </span><span>AS</span><span> nullbit ,
  304. leaf_offset ,
  305. </span><span>ISNULL</span>(syscolumns.length, cols.max_length) <span>AS</span> <span>[</span><span>length</span><span>]</span><span> ,
  306. cols.system_type_id ,
  307. cols.leaf_bit_position </span><span>AS</span><span> bitpos ,
  308. </span><span>ISNULL</span>(syscolumns.xprec, cols.<span>precision</span>) <span>AS</span><span> xprec ,
  309. </span><span>ISNULL</span>(syscolumns.xscale, cols.scale) <span>AS</span><span> xscale ,
  310. </span><span>SUBSTRING</span>(<span>[</span><span>nullBitMap</span><span>]</span>, cols.leaf_null_bit, <span>1</span>) <span>AS</span><span> is_null ,
  311. ( </span><span>CASE</span> <span>WHEN</span> leaf_offset <span><</span> <span>1</span>
  312. <span>AND</span> <span>SUBSTRING</span>(<span>[</span><span>nullBitMap</span><span>]</span><span>, cols.leaf_null_bit,
  313. </span><span>1</span>) <span>=</span> <span>0</span>
  314. <span>THEN</span> ( <span>CASE</span> <span>WHEN</span> <span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  315. ( </span><span>2</span>
  316. <span>*</span><span> leaf_offset
  317. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span>, <span>2</span>)))) <span>></span> <span>30000</span>
  318. <span>THEN</span> <span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  319. ( </span><span>2</span>
  320. <span>*</span><span> leaf_offset
  321. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span>, <span>2</span><span>))))
  322. </span><span>-</span> <span>POWER</span>(<span>2</span>, <span>15</span><span>)
  323. </span><span>ELSE</span> <span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  324. ( </span><span>2</span>
  325. <span>*</span><span> leaf_offset
  326. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span>, <span>2</span><span>))))
  327. </span><span>END</span><span> )
  328. </span><span>END</span> ) <span>AS</span> <span>[</span><span>Column value Size</span><span>]</span><span> ,
  329. ( </span><span>CASE</span> <span>WHEN</span> leaf_offset <span><</span> <span>1</span>
  330. <span>AND</span> <span>SUBSTRING</span>(<span>[</span><span>nullBitMap</span><span>]</span><span>, cols.leaf_null_bit,
  331. </span><span>1</span>) <span>=</span> <span>0</span>
  332. <span>THEN</span> ( <span>CASE</span> <span>WHEN</span> <span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  333. ( </span><span>2</span>
  334. <span>*</span><span> leaf_offset
  335. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span>, <span>2</span>)))) <span>></span> <span>30000</span>
  336. <span>AND</span> <span>ISNULL</span>(<span>NULLIF</span>(<span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  337. ( </span><span>2</span>
  338. <span>*</span><span> ( ( leaf_offset
  339. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span><span> ) )
  340. </span><span>-</span> <span>1</span>, <span>2</span>)))), <span>0</span><span>),
  341. </span><span>[</span><span>varColumnStart</span><span>]</span>) <span><</span> <span>30000</span>
  342. <span>THEN</span> ( <span>CASE</span> <span>WHEN</span> <span>[</span><span>System_type_id</span><span>]</span> <span>IN</span><span> (
  343. </span><span>35</span>, <span>34</span>, <span>99</span> ) <span>THEN</span> <span>16</span>
  344. <span>ELSE</span> <span>24</span>
  345. <span>END</span><span> )
  346. </span><span>WHEN</span> <span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  347. ( </span><span>2</span>
  348. <span>*</span><span> leaf_offset
  349. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span>, <span>2</span>)))) <span>></span> <span>30000</span>
  350. <span>AND</span> <span>ISNULL</span>(<span>NULLIF</span>(<span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  351. ( </span><span>2</span>
  352. <span>*</span><span> ( ( leaf_offset
  353. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span><span> ) )
  354. </span><span>-</span> <span>1</span>, <span>2</span>)))), <span>0</span><span>),
  355. </span><span>[</span><span>varColumnStart</span><span>]</span>) <span>></span> <span>30000</span>
  356. <span>THEN</span> ( <span>CASE</span> <span>WHEN</span> <span>[</span><span>System_type_id</span><span>]</span> <span>IN</span><span> (
  357. </span><span>35</span>, <span>34</span>, <span>99</span> ) <span>THEN</span> <span>16</span>
  358. <span>ELSE</span> <span>24</span>
  359. <span>END</span> ) <span>--</span><span>24 </span>
  360. <span>WHEN</span> <span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  361. ( </span><span>2</span>
  362. <span>*</span><span> leaf_offset
  363. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span>, <span>2</span>)))) <span><</span> <span>30000</span>
  364. <span>AND</span> <span>ISNULL</span>(<span>NULLIF</span>(<span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  365. ( </span><span>2</span>
  366. <span>*</span><span> ( ( leaf_offset
  367. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span><span> ) )
  368. </span><span>-</span> <span>1</span>, <span>2</span>)))), <span>0</span><span>),
  369. </span><span>[</span><span>varColumnStart</span><span>]</span>) <span><</span> <span>30000</span>
  370. <span>THEN</span> ( <span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  371. ( </span><span>2</span>
  372. <span>*</span><span> leaf_offset
  373. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span>, <span>2</span><span>))))
  374. </span><span>-</span> <span>ISNULL</span>(<span>NULLIF</span>(<span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  375. ( </span><span>2</span>
  376. <span>*</span><span> ( ( leaf_offset
  377. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span><span> ) )
  378. </span><span>-</span> <span>1</span>, <span>2</span>)))), <span>0</span><span>),
  379. </span><span>[</span><span>varColumnStart</span><span>]</span><span>) )
  380. </span><span>WHEN</span> <span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  381. ( </span><span>2</span>
  382. <span>*</span><span> leaf_offset
  383. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span>, <span>2</span>)))) <span><</span> <span>30000</span>
  384. <span>AND</span> <span>ISNULL</span>(<span>NULLIF</span>(<span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  385. ( </span><span>2</span>
  386. <span>*</span><span> ( ( leaf_offset
  387. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span><span> ) )
  388. </span><span>-</span> <span>1</span>, <span>2</span>)))), <span>0</span><span>),
  389. </span><span>[</span><span>varColumnStart</span><span>]</span>) <span>></span> <span>30000</span>
  390. <span>THEN</span> <span>POWER</span>(<span>2</span>, <span>15</span><span>)
  391. </span><span>+</span> <span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  392. ( </span><span>2</span>
  393. <span>*</span><span> leaf_offset
  394. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span>, <span>2</span><span>))))
  395. </span><span>-</span> <span>ISNULL</span>(<span>NULLIF</span>(<span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  396. ( </span><span>2</span>
  397. <span>*</span><span> ( ( leaf_offset
  398. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span><span> ) )
  399. </span><span>-</span> <span>1</span>, <span>2</span>)))), <span>0</span><span>),
  400. </span><span>[</span><span>varColumnStart</span><span>]</span><span>)
  401. </span><span>END</span><span> )
  402. </span><span>END</span> ) <span>AS</span> <span>[</span><span>Column Length</span><span>]</span><span> ,
  403. ( </span><span>CASE</span> <span>WHEN</span> <span>SUBSTRING</span>(<span>[</span><span>nullBitMap</span><span>]</span>, cols.leaf_null_bit, <span>1</span>) <span>=</span> <span>1</span>
  404. <span>THEN</span> <span>NULL</span>
  405. <span>ELSE</span> <span>SUBSTRING</span><span>(Rowlogcontents,
  406. ( ( </span><span>CASE</span> <span>WHEN</span> <span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  407. ( </span><span>2</span>
  408. <span>*</span><span> leaf_offset
  409. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span>, <span>2</span>)))) <span>></span> <span>30000</span>
  410. <span>THEN</span> <span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  411. ( </span><span>2</span>
  412. <span>*</span><span> leaf_offset
  413. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span>, <span>2</span><span>))))
  414. </span><span>-</span> <span>POWER</span>(<span>2</span>, <span>15</span><span>)
  415. </span><span>ELSE</span> <span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  416. ( </span><span>2</span>
  417. <span>*</span><span> leaf_offset
  418. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span>, <span>2</span><span>))))
  419. </span><span>END</span><span> )
  420. </span><span>-</span> ( <span>CASE</span> <span>WHEN</span> <span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  421. ( </span><span>2</span>
  422. <span>*</span><span> leaf_offset
  423. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span>, <span>2</span>)))) <span>></span> <span>30000</span>
  424. <span>AND</span> <span>ISNULL</span>(<span>NULLIF</span>(<span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  425. ( </span><span>2</span>
  426. <span>*</span><span> ( ( leaf_offset
  427. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span><span> ) )
  428. </span><span>-</span> <span>1</span>, <span>2</span>)))), <span>0</span><span>),
  429. </span><span>[</span><span>varColumnStart</span><span>]</span>) <span><</span> <span>30000</span>
  430. <span>THEN</span> ( <span>CASE</span>
  431. <span>WHEN</span> <span>[</span><span>System_type_id</span><span>]</span> <span>IN</span><span> (
  432. </span><span>35</span>, <span>34</span>, <span>99</span><span> )
  433. </span><span>THEN</span> <span>16</span>
  434. <span>ELSE</span> <span>24</span>
  435. <span>END</span> ) <span>--</span><span>24 </span>
  436. <span>WHEN</span> <span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  437. ( </span><span>2</span>
  438. <span>*</span><span> leaf_offset
  439. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span>, <span>2</span>)))) <span>></span> <span>30000</span>
  440. <span>AND</span> <span>ISNULL</span>(<span>NULLIF</span>(<span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  441. ( </span><span>2</span>
  442. <span>*</span><span> ( ( leaf_offset
  443. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span><span> ) )
  444. </span><span>-</span> <span>1</span>, <span>2</span>)))), <span>0</span><span>),
  445. </span><span>[</span><span>varColumnStart</span><span>]</span>) <span>></span> <span>30000</span>
  446. <span>THEN</span> ( <span>CASE</span>
  447. <span>WHEN</span> <span>[</span><span>System_type_id</span><span>]</span> <span>IN</span><span> (
  448. </span><span>35</span>, <span>34</span>, <span>99</span><span> )
  449. </span><span>THEN</span> <span>16</span>
  450. <span>ELSE</span> <span>24</span>
  451. <span>END</span> ) <span>--</span><span>24 </span>
  452. <span>WHEN</span> <span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  453. ( </span><span>2</span>
  454. <span>*</span><span> leaf_offset
  455. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span>, <span>2</span>)))) <span><</span> <span>30000</span>
  456. <span>AND</span> <span>ISNULL</span>(<span>NULLIF</span>(<span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  457. ( </span><span>2</span>
  458. <span>*</span><span> ( ( leaf_offset
  459. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span><span> ) )
  460. </span><span>-</span> <span>1</span>, <span>2</span>)))), <span>0</span><span>),
  461. </span><span>[</span><span>varColumnStart</span><span>]</span>) <span><</span> <span>30000</span>
  462. <span>THEN</span> <span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  463. ( </span><span>2</span>
  464. <span>*</span><span> leaf_offset
  465. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span>, <span>2</span><span>))))
  466. </span><span>-</span> <span>ISNULL</span>(<span>NULLIF</span>(<span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  467. ( </span><span>2</span>
  468. <span>*</span><span> ( ( leaf_offset
  469. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span><span> ) )
  470. </span><span>-</span> <span>1</span>, <span>2</span>)))), <span>0</span><span>),
  471. </span><span>[</span><span>varColumnStart</span><span>]</span><span>)
  472. </span><span>WHEN</span> <span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  473. ( </span><span>2</span>
  474. <span>*</span><span> leaf_offset
  475. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span>, <span>2</span>)))) <span><</span> <span>30000</span>
  476. <span>AND</span> <span>ISNULL</span>(<span>NULLIF</span>(<span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  477. ( </span><span>2</span>
  478. <span>*</span><span> ( ( leaf_offset
  479. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span><span> ) )
  480. </span><span>-</span> <span>1</span>, <span>2</span>)))), <span>0</span><span>),
  481. </span><span>[</span><span>varColumnStart</span><span>]</span>) <span>></span> <span>30000</span>
  482. <span>THEN</span> <span>POWER</span>(<span>2</span>, <span>15</span><span>)
  483. </span><span>+</span> <span>CONVERT</span>(<span>INT</span>, <span>CONVERT</span>(<span>BINARY</span>(<span>2</span>), <span>REVERSE</span>(<span>SUBSTRING</span>(<span>[</span><span>ColumnOffsetArray</span><span>]</span><span>,
  484. ( </span><span>2</span>
  485. <span>*</span><span> leaf_offset
  486. </span><span>*</span> <span>-</span><span>1</span> ) <span>-</span> <span>1</span>, <span>2</span><span>))))
  487. </span><span>-</span> <span>ISNULL
  488. <div class="">
  489. <ul class="m-news-opt fix">
  490. <li class="opt-item">
  491. <a href="/mysql-310510.html" target="_blank"><p>< 上一篇</p><p class="ellipsis">MySQL优化(八)</p></a>
  492. </li>
  493. <li class="opt-item ta-r">
  494. <a href="/mysql-310512.html" target="_blank"><p>下一篇 ></p><p class="ellipsis">SqlServer横向扩展负载均衡终极利器SqlServerProxy</p></a>
  495. </li>
  496. </ul>
  497. </div>
  498. </span>

人气教程排行