ReadTrace_Queries.sql 59 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627
  1. -- Use either the nexus DB or ReadTrace DB
  2. USE sqlnexus
  3. --USE PerfAnalysis
  4. GO
  5. -- Get Top Unique Batches same as in ReadTrace report
  6. -- From here we can get the Query Hash that allows us to search for the denormalized version of the queries in case we want to execute for repro purposes
  7. SELECT ROW_NUMBER() OVER(ORDER BY CPU DESC) AS QueryNumber, HashID, Executes, CPU, Duration, Reads, Writes, Attentions, [NormText]
  8. FROM (SELECT a.HashID,
  9. SUM(CompletedEvents) AS Executes,
  10. SUM(TotalCPU) AS CPU,
  11. SUM(TotalDuration) AS Duration,
  12. SUM(TotalReads) AS Reads,
  13. SUM(TotalWrites) AS Writes,
  14. SUM(AttentionEvents) AS Attentions,
  15. --(SELECT TOP 1 StartTime FROM ReadTrace.tblTimeIntervals i ORDER BY StartTime) AS [StartTime],
  16. --(SELECT TOP 1 EndTime FROM ReadTrace.tblTimeIntervals i ORDER BY EndTime DESC) AS [EndTime],
  17. (SELECT CAST(NormText AS NVARCHAR(4000)) FROM ReadTrace.tblUniqueBatches b WHERE b.HashID = a.HashID) AS [NormText],
  18. ROW_NUMBER() OVER(ORDER BY SUM(TotalCPU) desc) AS CPUDesc,
  19. ROW_NUMBER() OVER(ORDER BY SUM(TotalCPU) asc) AS CPUAsc,
  20. ROW_NUMBER() OVER(ORDER BY SUM(TotalDuration) desc) AS DurationDesc,
  21. ROW_NUMBER() OVER(ORDER BY SUM(TotalDuration) asc) AS DurationAsc,
  22. ROW_NUMBER() OVER(ORDER BY SUM(TotalReads) desc) AS ReadsDesc,
  23. ROW_NUMBER() OVER(ORDER BY SUM(TotalReads) asc) AS ReadsAsc,
  24. ROW_NUMBER() OVER(ORDER BY SUM(TotalWrites) desc) AS WritesDesc,
  25. ROW_NUMBER() OVER(ORDER BY SUM(TotalWrites) asc) AS WritesAsc
  26. FROM ReadTrace.tblBatchPartialAggs a
  27. GROUP BY a.HashID
  28. ) AS Outcome
  29. WHERE CPUDesc <= 10 OR CPUAsc <= 10 OR DurationDesc <= 10 OR DurationAsc <= 10
  30. OR ReadsDesc <= 10 OR ReadsAsc <= 10 OR WritesDesc <= 10 OR WritesAsc <= 10
  31. ORDER BY CPU DESC
  32. OPTION (RECOMPILE)
  33. GO
  34. -- Get all statements for specific Query Hash
  35. -- Replace Query Hash for the one you want to serach for from the previous query
  36. SELECT DISTINCT LTRIM(RTRIM(REPLACE(t2.TextData, CHAR(9), ''))) AS TextData, t2.Reads*8 AS Read_KB, t2.[DBID]
  37. ,t2.Duration/1000 As Duration_ms, t2.CPU, t2.HashID
  38. ,LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')) AS [NormalizedTextData]
  39. ,t4.Name AS [Procedure]
  40. FROM [ReadTrace].[tblBatches] t2
  41. INNER JOIN [ReadTrace].[tblUniqueBatches] t3 ON t2.HashID = t3.HashID
  42. LEFT JOIN ReadTrace.tblProcedureNames t4 on t3.SpecialProcID = t4.SpecialProcID
  43. WHERE t2.HashID = -6584980619987316302 -- Replace Query Hash for the one you want to serach for from the previous query
  44. AND t2.TextData IS NOT NULL
  45. --ORDER BY Duration DESC
  46. --ORDER BY CPU DESC
  47. ORDER BY Reads*8 DESC
  48. GO
  49. -- Get all statements ordered by...
  50. SELECT DISTINCT LTRIM(RTRIM(REPLACE(t2.TextData, CHAR(9), ''))) AS TextData, t2.Reads*8 AS Read_KB, t2.[DBID]
  51. ,t2.Duration/1000 As Duration_ms, t2.CPU, t2.HashID
  52. ,LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')) AS [NormalizedTextData]
  53. ,t4.Name AS [Procedure]
  54. FROM [ReadTrace].[tblBatches] t2
  55. INNER JOIN [ReadTrace].[tblUniqueBatches] t3 ON t2.HashID = t3.HashID
  56. LEFT JOIN ReadTrace.tblProcedureNames t4 on t3.SpecialProcID = t4.SpecialProcID
  57. WHERE t2.TextData IS NOT NULL
  58. --ORDER BY t2.Duration/1000 DESC
  59. --ORDER BY t2.CPU DESC
  60. ORDER BY t2.Reads*8 DESC
  61. GO
  62. -- Get list of errors
  63. SELECT [DBID],[Error],
  64. COUNT(*) AS [Nr_Events],
  65. (SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(text,'%.*ls','%'),'%d','%'),'%ls','%'),'%S_MSG','%'),'%S_PGID','%'),'%#016I64x','%'),'%p','%'),'%08x','%'),'%u','%'),'%I64d','%'),'%s','%'),'%ld','%'),'%lx','%'), '%%%', '%')
  66. FROM sys.messages WHERE message_id = [Error] AND language_id = 1033) AS [Error_Msg]
  67. FROM [ReadTrace].[tblInterestingEvents]
  68. WHERE [Error] IS NOT NULL AND [DBID] > 4
  69. GROUP BY [Error], [DBID]
  70. ORDER BY [DBID], [Error]
  71. GO
  72. -- Get normalized batches with errors
  73. SELECT DISTINCT t1.[DBID]
  74. ,t1.[TextData] AS [Event]
  75. -- ,t1.[ObjectID]
  76. ,t1.[Error]
  77. -- ,t1.[BatchSeq]
  78. ,t2.[HashID]
  79. ,LTRIM(REPLACE(REPLACE(t2.[TextData],CHAR(10),''),CHAR(13),'')) AS [TextData]
  80. ,LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')) AS [Normalized_TextData]
  81. -- ,LEFT(LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')),150) AS [Normalized_TextData_1st150Chars]
  82. ,(SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(text,'%.*ls','%'),'%d','%'),'%ls','%'),'%S_MSG','%'),'%S_PGID','%'),'%#016I64x','%'),'%p','%'),'%08x','%'),'%u','%'),'%I64d','%'),'%s','%'),'%ld','%'),'%lx','%'), '%%%', '%')
  83. FROM sys.messages WHERE message_id = [Error] AND language_id = 1033) AS [Error_Msg]
  84. ,t4.Name AS [Procedure]
  85. FROM [ReadTrace].[tblInterestingEvents] t1
  86. INNER JOIN [ReadTrace].[tblBatches] t2 ON t1.BatchSeq = t2.BatchSeq
  87. INNER JOIN [ReadTrace].[tblUniqueBatches] t3 ON t2.HashID = t3.HashID
  88. LEFT JOIN ReadTrace.tblProcedureNames t4 on t3.SpecialProcID = t4.SpecialProcID
  89. WHERE t1.[DBID] > 2
  90. AND t2.TextData IS NOT NULL
  91. AND t1.TextData LIKE 'Error:%'
  92. ORDER BY [Error], [DBID]
  93. GO
  94. -- Get summary of batches with errors
  95. SELECT DISTINCT t1.[DBID]
  96. --,t1.[TextData] AS [Event]
  97. ,t1.[Error]
  98. ,LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')) AS [Normalized_TextData]
  99. -- ,LEFT(LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')),150) AS [Normalized_TextData_1st150Chars]
  100. ,(SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(text,'%.*ls','%'),'%d','%'),'%ls','%'),'%S_MSG','%'),'%S_PGID','%'),'%#016I64x','%'),'%p','%'),'%08x','%'),'%u','%'),'%I64d','%'),'%s','%'),'%ld','%'),'%lx','%'), '%%%', '%')
  101. FROM sys.messages WHERE message_id = [Error] AND language_id = 1033) AS [Error_Msg]
  102. ,t4.Name AS [Procedure]
  103. FROM [ReadTrace].[tblInterestingEvents] t1
  104. INNER JOIN [ReadTrace].[tblBatches] t2 ON t1.BatchSeq = t2.BatchSeq
  105. INNER JOIN [ReadTrace].[tblUniqueBatches] t3 ON t2.HashID = t3.HashID
  106. LEFT JOIN ReadTrace.tblProcedureNames t4 on t3.SpecialProcID = t4.SpecialProcID
  107. WHERE t1.[DBID] > 2
  108. AND t2.TextData IS NOT NULL
  109. AND t1.TextData LIKE 'Error:%'
  110. ORDER BY [Error], [DBID]
  111. GO
  112. -- Get list of interesting events
  113. SELECT DISTINCT te.name AS [Event_Name], COUNT(Seq) AS Number_Events, e.trace_event_id
  114. FROM ReadTrace.tblInterestingEvents x
  115. INNER JOIN ReadTrace.trace_events e ON x.EventID = e.trace_event_id
  116. INNER JOIN sys.trace_events te ON e.trace_event_id = te.trace_event_id
  117. GROUP BY te.name, e.trace_event_id
  118. ORDER BY 2 DESC
  119. -- Get normalized batches with Lock escalations
  120. -- https://docs.microsoft.com/sql/relational-databases/event-classes/lock-escalation-event-class
  121. SELECT DISTINCT t1.[DBID]
  122. ,t1.[EventID]
  123. ,t1.[EventSubclass]
  124. , CASE WHEN t1.[EventSubclass] = 0 THEN 'LOCK_THRESHOLD' ELSE 'MEMORY_THRESHOLD' END AS [EventSubclass_type]
  125. -- ,t1.[BatchSeq]
  126. ,t3.[HashID]
  127. ,COUNT(t1.BatchSeq) AS [Nr_Events]
  128. ,LTRIM(REPLACE(REPLACE(t2.[TextData],CHAR(10),''),CHAR(13),'')) AS [TextData]
  129. ,LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')) AS [Normalized_TextData]
  130. -- ,LEFT(LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')),150) AS [Normalized_TextData_1st150Chars]
  131. ,t4.Name AS [Procedure]
  132. FROM [ReadTrace].[tblInterestingEvents] t1
  133. LEFT JOIN [ReadTrace].[tblBatches] t2 ON t1.BatchSeq = t2.BatchSeq
  134. INNER JOIN [ReadTrace].[tblUniqueBatches] t3 ON t2.HashID = t3.HashID
  135. LEFT JOIN ReadTrace.tblProcedureNames t4 on t3.SpecialProcID = t4.SpecialProcID
  136. WHERE t1.[DBID] > 2
  137. AND t2.TextData IS NOT NULL
  138. AND t1.EventID = 60
  139. GROUP BY t1.[DBID],t1.[EventID],t1.[EventSubclass],t2.[TextData],t3.[NormText],t3.[HashID],t4.Name
  140. ORDER BY [DBID], [Nr_Events] DESC
  141. GO
  142. -- Get normalized batches with HASH warnings
  143. -- https://docs.microsoft.com/sql/relational-databases/event-classes/hash-warning-event-class
  144. SELECT DISTINCT t1.[DBID]
  145. ,t1.[EventID]
  146. ,t1.[EventSubclass]
  147. , CASE WHEN t1.[EventSubclass] = 0 THEN 'Recursion' ELSE 'Bailout' END AS [EventSubclass_type]
  148. -- ,t1.[BatchSeq]
  149. ,t3.[HashID]
  150. ,COUNT(t1.BatchSeq) AS [Nr_Events]
  151. ,LTRIM(REPLACE(REPLACE(t2.[TextData],CHAR(10),''),CHAR(13),'')) AS [TextData]
  152. ,LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')) AS [Normalized_TextData]
  153. -- ,LEFT(LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')),150) AS [Normalized_TextData_1st150Chars]
  154. ,t4.Name AS [Procedure]
  155. FROM [ReadTrace].[tblInterestingEvents] t1
  156. LEFT JOIN [ReadTrace].[tblBatches] t2 ON t1.BatchSeq = t2.BatchSeq
  157. INNER JOIN [ReadTrace].[tblUniqueBatches] t3 ON t2.HashID = t3.HashID
  158. LEFT JOIN ReadTrace.tblProcedureNames t4 on t3.SpecialProcID = t4.SpecialProcID
  159. WHERE t1.[DBID] > 2
  160. AND t2.TextData IS NOT NULL
  161. AND t1.EventID = 55
  162. GROUP BY t1.[DBID],t1.[EventID],t1.[EventSubclass],t2.[TextData],t3.[NormText],t3.[HashID],t4.Name
  163. ORDER BY [DBID], [Nr_Events] DESC
  164. GO
  165. -- Get summary of batches with HASH warnings
  166. -- https://docs.microsoft.com/sql/relational-databases/event-classes/hash-warning-event-class
  167. SELECT DISTINCT t1.[DBID]
  168. , CASE WHEN t1.[EventSubclass] = 0 THEN 'Recursion' ELSE 'Bailout' END AS [EventSubclass_type]
  169. ,COUNT(t1.BatchSeq) AS [Nr_Events]
  170. ,LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')) AS [Normalized_TextData]
  171. -- ,LEFT(LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')),150) AS [Normalized_TextData_1st150Chars]
  172. ,t4.Name AS [Procedure]
  173. FROM [ReadTrace].[tblInterestingEvents] t1
  174. LEFT JOIN [ReadTrace].[tblBatches] t2 ON t1.BatchSeq = t2.BatchSeq
  175. INNER JOIN [ReadTrace].[tblUniqueBatches] t3 ON t2.HashID = t3.HashID
  176. LEFT JOIN ReadTrace.tblProcedureNames t4 on t3.SpecialProcID = t4.SpecialProcID
  177. WHERE t1.[DBID] > 2
  178. AND t2.TextData IS NOT NULL
  179. AND t1.EventID = 55
  180. GROUP BY t1.[DBID],t1.[EventSubclass],t3.[NormText],t4.Name
  181. ORDER BY [DBID], [Nr_Events] DESC
  182. GO
  183. -- Get normalized batches with SORT warnings
  184. -- https://docs.microsoft.com/sql/relational-databases/event-classes/sort-warnings-event-class
  185. SELECT DISTINCT t1.[DBID]
  186. ,t1.[EventID]
  187. ,t1.[EventSubclass]
  188. , CASE WHEN t1.[EventSubclass] = 1 THEN 'Single pass' ELSE 'Multiple pass' END AS [EventSubclass_type]
  189. -- ,t1.[BatchSeq]
  190. ,t3.[HashID]
  191. ,COUNT(t1.BatchSeq) AS [Nr_Events]
  192. ,LTRIM(REPLACE(REPLACE(t2.[TextData],CHAR(10),''),CHAR(13),'')) AS [TextData]
  193. ,LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')) AS [Normalized_TextData]
  194. -- ,LEFT(LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')),150) AS [Normalized_TextData_1st150Chars]
  195. ,t4.Name AS [Procedure]
  196. FROM [ReadTrace].[tblInterestingEvents] t1
  197. LEFT JOIN [ReadTrace].[tblBatches] t2 ON t1.BatchSeq = t2.BatchSeq
  198. INNER JOIN [ReadTrace].[tblUniqueBatches] t3 ON t2.HashID = t3.HashID
  199. LEFT JOIN ReadTrace.tblProcedureNames t4 on t3.SpecialProcID = t4.SpecialProcID
  200. WHERE t1.[DBID] > 2
  201. AND t2.TextData IS NOT NULL
  202. AND t1.EventID = 69
  203. GROUP BY t1.[DBID],t1.[EventID],t1.[EventSubclass],t2.[TextData],t3.[NormText],t3.[HashID],t4.Name
  204. ORDER BY [DBID], [Nr_Events] DESC
  205. GO
  206. -- Get summary of batches with SORT warnings
  207. -- https://docs.microsoft.com/sql/relational-databases/event-classes/sort-warnings-event-class
  208. SELECT DISTINCT t1.[DBID]
  209. , CASE WHEN t1.[EventSubclass] = 1 THEN 'Single pass' ELSE 'Multiple pass' END AS [EventSubclass_type]
  210. ,COUNT(t1.BatchSeq) AS [Nr_Events]
  211. ,LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')) AS [Normalized_TextData]
  212. -- ,LEFT(LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')),150) AS [Normalized_TextData_1st150Chars]
  213. ,t4.Name AS [Procedure]
  214. FROM [ReadTrace].[tblInterestingEvents] t1
  215. LEFT JOIN [ReadTrace].[tblBatches] t2 ON t1.BatchSeq = t2.BatchSeq
  216. INNER JOIN [ReadTrace].[tblUniqueBatches] t3 ON t2.HashID = t3.HashID
  217. LEFT JOIN ReadTrace.tblProcedureNames t4 on t3.SpecialProcID = t4.SpecialProcID
  218. WHERE t1.[DBID] > 2
  219. AND t2.TextData IS NOT NULL
  220. AND t1.EventID = 69
  221. GROUP BY t1.[DBID],t1.[EventSubclass],t3.[NormText],t4.Name
  222. ORDER BY [DBID], [Nr_Events] DESC
  223. GO
  224. -- Get normalized batches with missing join predicate
  225. -- https://docs.microsoft.com/sql/relational-databases/event-classes/hash-warning-event-class
  226. SELECT DISTINCT t1.[DBID]
  227. ,t1.[EventID]
  228. -- ,t1.[BatchSeq]
  229. ,t3.[HashID]
  230. ,COUNT(t1.BatchSeq) AS [Nr_Events]
  231. ,LTRIM(REPLACE(REPLACE(t2.[TextData],CHAR(10),''),CHAR(13),'')) AS [TextData]
  232. ,LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')) AS [Normalized_TextData]
  233. -- ,LEFT(LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')),150) AS [Normalized_TextData_1st150Chars]
  234. ,t4.Name AS [Procedure]
  235. FROM [ReadTrace].[tblInterestingEvents] t1
  236. LEFT JOIN [ReadTrace].[tblBatches] t2 ON t1.BatchSeq = t2.BatchSeq
  237. INNER JOIN [ReadTrace].[tblUniqueBatches] t3 ON t2.HashID = t3.HashID
  238. LEFT JOIN ReadTrace.tblProcedureNames t4 on t3.SpecialProcID = t4.SpecialProcID
  239. WHERE t1.[DBID] > 2
  240. AND t2.TextData IS NOT NULL
  241. AND t1.EventID = 80
  242. GROUP BY t1.[DBID],t1.[EventID],t1.[EventSubclass],t2.[TextData],t3.[NormText],t3.[HashID],t4.Name
  243. ORDER BY [DBID], [Nr_Events] DESC
  244. GO
  245. -- Get normalized batches with attentions
  246. -- https://docs.microsoft.com/sql/relational-databases/event-classes/attention-event-class
  247. SELECT DISTINCT t1.[DBID]
  248. ,t1.[EventID]
  249. -- ,t1.[BatchSeq]
  250. ,t3.[HashID]
  251. ,COUNT(t1.BatchSeq) AS [Nr_Events]
  252. ,LTRIM(REPLACE(REPLACE(t2.[TextData],CHAR(10),''),CHAR(13),'')) AS [TextData]
  253. ,LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')) AS [Normalized_TextData]
  254. -- ,LEFT(LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')),150) AS [Normalized_TextData_1st150Chars]
  255. -- ,t2.StartTime AS BatchStartTime
  256. -- ,t1.StartTime AS AttentionTime
  257. ,AVG(DATEDIFF(ms, t2.StartTime, t1.StartTime)) AS AvgMsToAttention
  258. ,t4.Name AS [Procedure]
  259. FROM [ReadTrace].[tblInterestingEvents] t1
  260. LEFT JOIN [ReadTrace].[tblBatches] t2 ON t1.BatchSeq = t2.BatchSeq
  261. INNER JOIN [ReadTrace].[tblUniqueBatches] t3 ON t2.HashID = t3.HashID
  262. LEFT JOIN ReadTrace.tblProcedureNames t4 on t3.SpecialProcID = t4.SpecialProcID
  263. WHERE t2.TextData IS NOT NULL
  264. AND t1.EventID = 16
  265. GROUP BY t1.[DBID],t1.[EventID],t1.[EventSubclass],t2.[TextData],t3.[NormText],t3.[HashID],t4.Name--,t1.StartTime,t2.StartTime
  266. ORDER BY [DBID], [Nr_Events] DESC
  267. GO
  268. -- Get normalized batches with auto-stats
  269. SELECT DISTINCT t1.[DBID]
  270. ,t1.[EventID]
  271. -- ,t1.[BatchSeq]
  272. ,t3.[HashID]
  273. ,COUNT(t1.BatchSeq) AS [Nr_Events]
  274. ,LTRIM(REPLACE(REPLACE(t2.[TextData],CHAR(10),''),CHAR(13),'')) AS [TextData]
  275. ,LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')) AS [Normalized_TextData]
  276. -- ,LEFT(LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')),150) AS [Normalized_TextData_1st150Chars]
  277. ,t4.Name AS [Procedure]
  278. FROM [ReadTrace].[tblInterestingEvents] t1
  279. LEFT JOIN [ReadTrace].[tblBatches] t2 ON t1.BatchSeq = t2.BatchSeq
  280. INNER JOIN [ReadTrace].[tblUniqueBatches] t3 ON t2.HashID = t3.HashID
  281. LEFT JOIN ReadTrace.tblProcedureNames t4 on t3.SpecialProcID = t4.SpecialProcID
  282. WHERE t2.TextData IS NOT NULL
  283. AND t1.EventID = 58
  284. GROUP BY t1.[DBID],t1.[EventID],t1.[EventSubclass],t2.[TextData],t3.[NormText],t3.[HashID],t4.Name
  285. ORDER BY [DBID], [Nr_Events] DESC
  286. GO
  287. -- Get normalized batches with lock escalations
  288. -- https://docs.microsoft.com/sql/relational-databases/event-classes/attention-event-class
  289. SELECT DISTINCT t1.[DBID]
  290. ,t1.[EventID]
  291. -- ,t1.[BatchSeq]
  292. ,t3.[HashID]
  293. ,COUNT(t1.BatchSeq) AS [Nr_Events]
  294. ,LTRIM(REPLACE(REPLACE(t2.[TextData],CHAR(10),''),CHAR(13),'')) AS [TextData]
  295. ,LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')) AS [Normalized_TextData]
  296. -- ,LEFT(LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')),150) AS [Normalized_TextData_1st150Chars]
  297. ,t4.Name AS [Procedure]
  298. FROM [ReadTrace].[tblInterestingEvents] t1
  299. LEFT JOIN [ReadTrace].[tblBatches] t2 ON t1.BatchSeq = t2.BatchSeq
  300. INNER JOIN [ReadTrace].[tblUniqueBatches] t3 ON t2.HashID = t3.HashID
  301. LEFT JOIN ReadTrace.tblProcedureNames t4 on t3.SpecialProcID = t4.SpecialProcID
  302. WHERE t2.TextData IS NOT NULL
  303. AND t1.EventID = 60
  304. GROUP BY t1.[DBID],t1.[EventID],t1.[EventSubclass],t2.[TextData],t3.[NormText],t3.[HashID],t4.Name
  305. ORDER BY [DBID], [Nr_Events] DESC
  306. GO
  307. -- Get normalized batches with OLEDB errors
  308. -- https://docs.microsoft.com/sql/relational-databases/event-classes/oledb-errors-event-class
  309. SELECT DISTINCT t1.[DBID]
  310. ,t1.[EventID]
  311. -- ,t1.[BatchSeq]
  312. ,t3.[HashID]
  313. ,t1.[Error]
  314. ,COUNT(t1.BatchSeq) AS [Nr_Events]
  315. ,LTRIM(REPLACE(REPLACE(t2.[TextData],CHAR(10),''),CHAR(13),'')) AS [TextData]
  316. ,LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')) AS [Normalized_TextData]
  317. -- ,LEFT(LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')),150) AS [Normalized_TextData_1st150Chars]
  318. ,t4.Name AS [Procedure]
  319. FROM [ReadTrace].[tblInterestingEvents] t1
  320. LEFT JOIN [ReadTrace].[tblBatches] t2 ON t1.BatchSeq = t2.BatchSeq
  321. INNER JOIN [ReadTrace].[tblUniqueBatches] t3 ON t2.HashID = t3.HashID
  322. LEFT JOIN ReadTrace.tblProcedureNames t4 on t3.SpecialProcID = t4.SpecialProcID
  323. WHERE t2.TextData IS NOT NULL
  324. AND t1.EventID = 61
  325. GROUP BY t1.[DBID],t1.[EventID],t1.[EventSubclass],t2.[TextData],t3.[NormText],t3.[HashID],t4.Name,t1.[Error]
  326. ORDER BY [DBID], [Nr_Events] DESC
  327. GO
  328. --Get normalized batches with Exceptions
  329. SELECT DISTINCT t1.[DBID]
  330. ,t1.[EventID]
  331. -- ,t1.[BatchSeq]
  332. ,t3.[HashID]
  333. ,t1.[Error]
  334. ,COUNT(t1.BatchSeq) AS [Nr_Events]
  335. ,LTRIM(REPLACE(REPLACE(t2.[TextData],CHAR(10),''),CHAR(13),'')) AS [TextData]
  336. ,LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')) AS [Normalized_TextData]
  337. -- ,LEFT(LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')),150) AS [Normalized_TextData_1st150Chars]
  338. ,t4.Name AS [Procedure]
  339. -- ,LEFT(LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')),150) AS [Normalized_TextData_1st150Chars]
  340. ,(SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(text,'%.*ls','%'),'%d','%'),'%ls','%'),'%S_MSG','%'),'%S_PGID','%'),'%#016I64x','%'),'%p','%'),'%08x','%'),'%u','%'),'%I64d','%'),'%s','%'),'%ld','%'),'%lx','%'), '%%%', '%')
  341. FROM sys.messages WHERE message_id = [Error] AND language_id = 1033) AS [Error_Msg]
  342. FROM [ReadTrace].[tblInterestingEvents] t1
  343. LEFT JOIN [ReadTrace].[tblBatches] t2 ON t1.BatchSeq = t2.BatchSeq
  344. INNER JOIN [ReadTrace].[tblUniqueBatches] t3 ON t2.HashID = t3.HashID
  345. LEFT JOIN ReadTrace.tblProcedureNames t4 on t3.SpecialProcID = t4.SpecialProcID
  346. WHERE t2.TextData IS NOT NULL
  347. AND t1.EventID = 33
  348. GROUP BY t1.[DBID],t1.[EventID],t1.[EventSubclass],t2.[TextData],t3.[NormText],t3.[HashID],t4.Name,t1.[Error]
  349. ORDER BY [Nr_Events] DESC
  350. GO
  351. --Get statements with errors 207, 208, 245 and 257
  352. SELECT DISTINCT t1.[DBID]
  353. ,t1.[TextData]
  354. ,t1.[ObjectID]
  355. ,t1.[Error]
  356. --,t1.[BatchSeq]
  357. ,t2.[HashID]
  358. ,t2.[TextData]
  359. , CASE WHEN t1.TextData LIKE 'Error: 207%' THEN 'Invalid column name'
  360. WHEN t1.TextData LIKE 'Error: 245%' THEN 'Conversion failed when converting the %ls value to data type %ls.'
  361. WHEN t1.TextData LIKE 'Error: 208%' THEN 'Invalid object name'
  362. WHEN t1.TextData LIKE 'Error: 257%' THEN 'Implicit conversion from data type %ls to %ls is not allowed. Use the CONVERT function to run this query.'
  363. END AS [ErrorType]
  364. FROM [ReadTrace].[tblInterestingEvents] t1
  365. INNER JOIN [ReadTrace].[tblBatches] t2 ON t1.BatchSeq = t2.BatchSeq
  366. WHERE t1.[DBID] > 2 AND (t1.TextData LIKE 'Error: 207%'
  367. OR t1.TextData LIKE 'Error: 245%'
  368. OR t1.TextData LIKE 'Error: 208%'
  369. OR t1.TextData LIKE 'Error: 257%')
  370. GO
  371. -- Get batches with Deprecated code
  372. SET NOCOUNT ON;
  373. DECLARE @tblKeywords TABLE (
  374. KeywordID int IDENTITY(1,1) PRIMARY KEY,
  375. Keyword NVARCHAR(64), -- the keyword itself
  376. DeprecatedIn tinyint,
  377. DiscontinuedIn tinyint,
  378. Done bit
  379. );
  380. CREATE TABLE [#FinalResult](
  381. [DBID] int NOT NULL,
  382. [HashID] bigint NOT NULL,
  383. [Nr_Events] int NULL,
  384. [TextData] NVARCHAR(max) NULL,
  385. [Normalized_TextData] NVARCHAR(max) NULL,
  386. [Keyword] NVARCHAR(64)
  387. );
  388. -- Populate Keywords table
  389. INSERT INTO @tblKeywords (Keyword, DeprecatedIn, DiscontinuedIn, Done)
  390. SELECT 'disk init', NULL, 9, 0 UNION ALL
  391. SELECT 'disk resize', NULL, 9, 0 UNION ALL
  392. SELECT 'for load', NULL, 9, 0 UNION ALL
  393. SELECT 'dbcc dbrepair', NULL, 9, 0 UNION ALL
  394. SELECT 'dbcc newalloc', NULL, 9, 0 UNION ALL
  395. SELECT 'dbcc pintable', NULL, 9, 0 UNION ALL
  396. SELECT 'dbcc unpintable', NULL, 9, 0 UNION ALL
  397. SELECT 'dbcc rowlock', NULL, 9, 0 UNION ALL
  398. SELECT 'dbcc textall', NULL, 9, 0 UNION ALL
  399. SELECT 'dbcc textalloc', NULL, 9, 0 UNION ALL
  400. SELECT '*=', NULL, 9, 0 UNION ALL
  401. SELECT '=*', NULL, 9, 0 UNION ALL
  402. -- Deprecated on SQL Server 2005 and not yet discontinued
  403. SELECT '::', 9, NULL, 0 UNION ALL
  404. SELECT 'setuser', 9, NULL, 0 UNION ALL
  405. SELECT 'sp_helpdevice', 9, NULL, 0 UNION ALL
  406. SELECT 'sp_addtype', 9, NULL, 0 UNION ALL
  407. SELECT 'sp_attach_db', 9, NULL, 0 UNION ALL
  408. SELECT 'sp_attach_single_file_db', 9, NULL, 0 UNION ALL
  409. SELECT 'sp_bindefault', 9, NULL, 0 UNION ALL
  410. SELECT 'sp_unbindefault', 9, NULL, 0 UNION ALL
  411. SELECT 'sp_bindrule', 9, NULL, 0 UNION ALL
  412. SELECT 'sp_unbindrule', 9, NULL, 0 UNION ALL
  413. SELECT 'create default', 9, NULL, 0 UNION ALL
  414. SELECT 'drop default', 9, NULL, 0 UNION ALL
  415. SELECT 'create rule', 9, NULL, 0 UNION ALL
  416. SELECT 'drop rule', 9, NULL, 0 UNION ALL
  417. SELECT 'sp_renamedb', 9, NULL, 0 UNION ALL
  418. SELECT 'sp_resetstatus', 9, NULL, 0 UNION ALL
  419. SELECT 'dbcc dbreindex', 9, NULL, 0 UNION ALL
  420. SELECT 'dbcc indexdefrag', 9, NULL, 0 UNION ALL
  421. SELECT 'dbcc showcontig', 9, NULL, 0 UNION ALL
  422. SELECT 'sp_addextendedproc', 9, NULL, 0 UNION ALL
  423. SELECT 'sp_dropextendedproc', 9, NULL, 0 UNION ALL
  424. SELECT 'sp_helpextendedproc', 9, NULL, 0 UNION ALL
  425. SELECT 'xp_loginconfig', 9, NULL, 0 UNION ALL
  426. SELECT 'sp_fulltext_catalog', 9, NULL, 0 UNION ALL
  427. SELECT 'sp_fulltext_table', 9, NULL, 0 UNION ALL
  428. SELECT 'sp_fulltext_column', 9, NULL, 0 UNION ALL
  429. SELECT 'sp_fulltext_database', 9, NULL, 0 UNION ALL
  430. SELECT 'sp_help_fulltext_tables', 9, NULL, 0 UNION ALL
  431. SELECT 'sp_help_fulltext_columns', 9, NULL, 0 UNION ALL
  432. SELECT 'sp_help_fulltext_catalogs', 9, NULL, 0 UNION ALL
  433. SELECT 'sp_help_fulltext_tables_cursor', 9, NULL, 0 UNION ALL
  434. SELECT 'sp_help_fulltext_columns_cursor', 9, NULL, 0 UNION ALL
  435. SELECT 'sp_help_fulltext_catalogs_cursor', 9, NULL, 0 UNION ALL
  436. SELECT 'fn_get_sql', 9, NULL, 0 UNION ALL
  437. SELECT 'sp_indexoption', 9, NULL, 0 UNION ALL
  438. SELECT 'sp_lock', 9, NULL, 0 UNION ALL
  439. SELECT 'indexkey_property', 9, NULL, 0 UNION ALL
  440. SELECT 'file_id', 9, NULL, 0 UNION ALL
  441. SELECT 'sp_certify_removable', 9, NULL, 0 UNION ALL
  442. SELECT 'sp_create_removable', 9, NULL, 0 UNION ALL
  443. SELECT 'sp_dbremove', 9, NULL, 0 UNION ALL
  444. SELECT 'sp_addapprole', 9, NULL, 0 UNION ALL
  445. SELECT 'sp_dropapprole', 9, NULL, 0 UNION ALL
  446. SELECT 'sp_addlogin', 9, NULL, 0 UNION ALL
  447. SELECT 'sp_droplogin', 9, NULL, 0 UNION ALL
  448. SELECT 'sp_adduser', 9, NULL, 0 UNION ALL
  449. SELECT 'sp_dropuser', 9, NULL, 0 UNION ALL
  450. SELECT 'sp_grantdbaccess', 9, NULL, 0 UNION ALL
  451. SELECT 'sp_revokedbaccess', 9, NULL, 0 UNION ALL
  452. SELECT 'sp_addrole', 9, NULL, 0 UNION ALL
  453. SELECT 'sp_droprole', 9, NULL, 0 UNION ALL
  454. SELECT 'sp_approlepassword', 9, NULL, 0 UNION ALL
  455. SELECT 'sp_password', 9, NULL, 0 UNION ALL
  456. SELECT 'sp_changeobjectowner', 9, NULL, 0 UNION ALL
  457. SELECT 'sp_defaultdb', 9, NULL, 0 UNION ALL
  458. SELECT 'sp_defaultlanguage', 9, NULL, 0 UNION ALL
  459. SELECT 'sp_denylogin', 9, NULL, 0 UNION ALL
  460. SELECT 'sp_grantlogin', 9, NULL, 0 UNION ALL
  461. SELECT 'sp_revokelogin', 9, NULL, 0 UNION ALL
  462. SELECT 'user_id', 9, NULL, 0 UNION ALL
  463. SELECT 'sp_srvrolepermission', 9, NULL, 0 UNION ALL
  464. SELECT 'sp_dbfixedrolepermission', 9, NULL, 0 UNION ALL
  465. SELECT 'text', 9, NULL, 0 UNION ALL
  466. SELECT 'ntext', 9, NULL, 0 UNION ALL
  467. SELECT 'image', 9, NULL, 0 UNION ALL
  468. SELECT 'textptrSELECT ', 9, NULL, 0 UNION ALL
  469. SELECT 'textvalidSELECT ', 9, NULL, 0 UNION ALL
  470. -- Discontinued on SQL Server 2008
  471. SELECT 'sp_addalias', 9, 10, 0 UNION ALL
  472. SELECT 'no_log', 9, 10, 0 UNION ALL
  473. SELECT 'truncate_only', 9, 10, 0 UNION ALL
  474. SELECT 'backup transaction', 9, 10, 0 UNION ALL
  475. SELECT 'dbcc concurrencyviolation', 9, 10, 0 UNION ALL
  476. SELECT 'sp_addgroup', 9, 10, 0 UNION ALL
  477. SELECT 'sp_changegroup', 9, 10, 0 UNION ALL
  478. SELECT 'sp_dropgroup', 9, 10, 0 UNION ALL
  479. SELECT 'sp_helpgroup', 9, 10, 0 UNION ALL
  480. SELECT 'sp_makewebtask', NULL, 10, 0 UNION ALL
  481. SELECT 'sp_dropwebtask', NULL, 10, 0 UNION ALL
  482. SELECT 'sp_runwebtask', NULL, 10, 0 UNION ALL
  483. SELECT 'sp_enumcodepages', NULL, 10, 0 UNION ALL
  484. SELECT 'dump', 9, 10, 0 UNION ALL
  485. SELECT 'load', 9, 10, 0 UNION ALL
  486. -- Undocumented system stored procedures are removed from sql server:
  487. SELECT 'sp_articlesynctranprocs', NULL, 10, 0 UNION ALL
  488. SELECT 'sp_diskdefault', NULL, 10, 0 UNION ALL
  489. SELECT 'sp_eventlog', NULL, 10, 0 UNION ALL
  490. SELECT 'sp_getmbcscharlen', NULL, 10, 0 UNION ALL
  491. SELECT 'sp_helplog', NULL, 10, 0 UNION ALL
  492. SELECT 'sp_helpsql', NULL, 10, 0 UNION ALL
  493. SELECT 'sp_ismbcsleadbyte', NULL, 10, 0 UNION ALL
  494. SELECT 'sp_lock2', NULL, 10, 0 UNION ALL
  495. SELECT 'sp_msget_current_activity', NULL, 10, 0 UNION ALL
  496. SELECT 'sp_msset_current_activity', NULL, 10, 0 UNION ALL
  497. SELECT 'sp_msobjessearch', NULL, 10, 0 UNION ALL
  498. SELECT 'xp_enum_activescriptengines', NULL, 10, 0 UNION ALL
  499. SELECT 'xp_eventlog', NULL, 10, 0 UNION ALL
  500. SELECT 'xp_getadmingroupname', NULL, 10, 0 UNION ALL
  501. SELECT 'xp_getfiledetails', NULL, 10, 0 UNION ALL
  502. SELECT 'xp_getlocalsystemaccountname', NULL, 10, 0 UNION ALL
  503. SELECT 'xp_isntadmin', NULL, 10, 0 UNION ALL
  504. SELECT 'xp_mslocalsystem', NULL, 10, 0 UNION ALL
  505. SELECT 'xp_msnt2000', NULL, 10, 0 UNION ALL
  506. SELECT 'xp_msplatform', NULL, 10, 0 UNION ALL
  507. SELECT 'xp_setsecurity', NULL, 10, 0 UNION ALL
  508. SELECT 'xp_varbintohexstr', NULL, 10, 0 UNION ALL
  509. -- Undocumented system tables are removed from sql server:
  510. SELECT 'spt_datatype_info', NULL, 10, 0 UNION ALL
  511. SELECT 'spt_datatype_info_ext', NULL, 10, 0 UNION ALL
  512. SELECT 'spt_provider_types', NULL, 10, 0 UNION ALL
  513. SELECT 'spt_server_info', NULL, 10, 0 UNION ALL
  514. SELECT 'spt_values', NULL, 10, 0 UNION ALL
  515. SELECT 'sysfulltextnotify ', NULL, 10, 0 UNION ALL
  516. SELECT 'syslocks', NULL, 10, 0 UNION ALL
  517. SELECT 'sysproperties', NULL, 10, 0 UNION ALL
  518. SELECT 'sysprotects_aux', NULL, 10, 0 UNION ALL
  519. SELECT 'sysprotects_view', NULL, 10, 0 UNION ALL
  520. SELECT 'sysremote_catalogs', NULL, 10, 0 UNION ALL
  521. SELECT 'sysremote_column_privileges', NULL, 10, 0 UNION ALL
  522. SELECT 'sysremote_columns', NULL, 10, 0 UNION ALL
  523. SELECT 'sysremote_foreign_keys', NULL, 10, 0 UNION ALL
  524. SELECT 'sysremote_indexes', NULL, 10, 0 UNION ALL
  525. SELECT 'sysremote_primary_keys', NULL, 10, 0 UNION ALL
  526. SELECT 'sysremote_provider_types', NULL, 10, 0 UNION ALL
  527. SELECT 'sysremote_schemata', NULL, 10, 0 UNION ALL
  528. SELECT 'sysremote_statistics', NULL, 10, 0 UNION ALL
  529. SELECT 'sysremote_table_privileges', NULL, 10, 0 UNION ALL
  530. SELECT 'sysremote_tables', NULL, 10, 0 UNION ALL
  531. SELECT 'sysremote_views', NULL, 10, 0 UNION ALL
  532. SELECT 'syssegments', NULL, 10, 0 UNION ALL
  533. SELECT 'sysxlogins', NULL, 10, 0 UNION ALL
  534. -- Deprecated on SQL Server 2008 and not yet discontinued
  535. SELECT 'sp_addremotelogin', 10, NULL, 0 UNION ALL
  536. SELECT 'sp_dropremotelogin', 10, NULL, 0 UNION ALL
  537. SELECT 'sp_helpremotelogin', 10, NULL, 0 UNION ALL
  538. SELECT 'sp_remoteoption', 10, NULL, 0 UNION ALL
  539. SELECT '@@remserver', 10, NULL, 0 UNION ALL
  540. SELECT 'remote_proc_transactions', 10, NULL, 0 UNION ALL
  541. SELECT 'sp_addumpdevice', 10, NULL, 0 UNION ALL
  542. SELECT 'xp_grantlogin', 10, NULL, 0 UNION ALL
  543. SELECT 'xp_revokelogin', 10, NULL, 0 UNION ALL
  544. SELECT 'grant all', 10, NULL, 0 UNION ALL
  545. SELECT 'deny all', 10, NULL, 0 UNION ALL
  546. SELECT 'revoke all', 10, NULL, 0 UNION ALL
  547. SELECT 'fn_virtualservernodes', 10, NULL, 0 UNION ALL
  548. SELECT 'fn_servershareddrives', 10, NULL, 0 UNION ALL
  549. SELECT 'writetext', 10, NULL, 0 UNION ALL
  550. SELECT 'updatetext', 10, NULL, 0 UNION ALL
  551. SELECT 'readtext', 10, NULL, 0 UNION ALL
  552. -- Discontinued on SQL Server 2012
  553. SELECT 'dbo_only', 9, 11, 0 UNION ALL -- on restore statements
  554. SELECT 'mediapassword', 9, 11, 0 UNION ALL -- on backup statements
  555. SELECT 'password', 9, 11, 0 UNION ALL -- on backup statements except for media
  556. SELECT 'with append', 10, 11, 0 UNION ALL -- on triggers
  557. SELECT 'sp_dboption', 9, 11, 0 UNION ALL
  558. SELECT 'databaseproperty', 9, 11, 0 UNION ALL
  559. SELECT 'fastfirstrow', 10, 11, 0 UNION ALL
  560. SELECT 'sp_addserver', 10, 11, 0 UNION ALL -- for linked servers
  561. SELECT 'sp_dropalias', 9, 11, 0 UNION ALL
  562. SELECT 'disable_def_cnst_chk', 10, 11, 0 UNION ALL
  563. SELECT 'sp_activedirectory_obj', NULL, 11, 0 UNION ALL
  564. SELECT 'sp_activedirectory_scp', NULL, 11, 0 UNION ALL
  565. SELECT 'sp_activedirectory_start', NULL, 11, 0 UNION ALL
  566. -- Deprecated on SQL Server 2012 and not yet discontinued
  567. SELECT 'compute by', NULL, 11, 0 UNION ALL
  568. SELECT 'compute', NULL, 11, 0 UNION ALL
  569. SELECT 'sp_change_users_login', 11, NULL, 0 UNION ALL
  570. SELECT 'sp_depends', 11, NULL, 0 UNION ALL
  571. SELECT 'sp_getbindtoken', 11, NULL, 0 UNION ALL
  572. SELECT 'sp_bindsession', 11, NULL, 0 UNION ALL
  573. SELECT 'fmtonly', 11, NULL, 0 UNION ALL
  574. SELECT 'sp_db_increased_partitions', 11, NULL, 0
  575. DECLARE @i int, @Keyword NVARCHAR(64)
  576. WHILE (SELECT COUNT(*) FROM @tblKeywords WHERE Done = 0) > 0
  577. BEGIN
  578. SELECT TOP 1 @i = KeywordID, @Keyword = '%' + Keyword + '%' FROM @tblKeywords WHERE Done = 0
  579. INSERT INTO #FinalResult
  580. SELECT DISTINCT t1.[DBID]
  581. ,t2.[HashID]
  582. ,COUNT(t2.BatchSeq) AS [Nr_Events]
  583. ,LTRIM(REPLACE(REPLACE(t2.[TextData],CHAR(10),''),CHAR(13),'')) AS [TextData]
  584. ,LTRIM(REPLACE(REPLACE(t3.[NormText],CHAR(10),''),CHAR(13),'')) AS [Normalized_TextData]
  585. ,@Keyword AS Search_Keyword
  586. FROM [ReadTrace].[tblBatchPartialAggs] t1
  587. INNER JOIN [ReadTrace].[tblBatches] t2 ON t1.HashID = t2.HashID
  588. INNER JOIN [ReadTrace].[tblUniqueBatches] t3 ON t2.HashID = t3.HashID
  589. WHERE t1.[DBID] > 2
  590. AND t2.TextData LIKE @Keyword
  591. GROUP BY t1.[DBID],t2.[TextData],t2.[HashID],t3.[NormText]
  592. UPDATE @tblKeywords
  593. SET Done = 1
  594. WHERE KeywordID = @i
  595. END
  596. SELECT * FROM #FinalResult
  597. ORDER BY [DBID], [Nr_Events] DESC
  598. DROP TABLE #FinalResult
  599. GO