У меня есть таблица трассировки в следующем формате.SQL - превращение таблицы трассировки во временную статистику
CREATE TABLE [dbo].[trace](
[trcId] [bigint] IDENTITY(1,1) NOT NULL,
[trcDateTime] [datetime] NULL,
[trcProgram] [nvarchar](150) NULL,
[trcCode] [nvarchar](8) NULL,
[trcText] [nvarchar](max) NULL,
[trcXML] [nvarchar](max) NULL,
[trcCorrGuid] [nvarchar](36) NULL, ...
Теперь я понимаю, что я могу использовать выбранные строки из трассировки для анализа времени отклика. Я хотел бы создать еще одну таблицу следующим образом:
CREATE TABLE [dbo].[executionHistory](
trcCorrId [nvarchar](36) NOT NULL,
startHIP datetime NOT NULL,
stopHIP datetime NOT NULL,
startOrch1 datetime NOT NULL,
stopOrch1 datetime NOT NULL,
startOrch2 datetime NOT NULL,
stopOrch2 datetime NOT NULL,
startWebMethoddatetime NOT NULL,
stopWebMethod datetime NOT NULL,
Или же может создать более общий:
CREATE TABLE [dbo].[executionHistory](
trcCorrId [nvarchar](36) NOT NULL,
eventName [nvarchar](36) NOT NULL,
eventStart datetime NOT NULL,
eventStop datetime NOT NULL
Baiscally У меня есть C# (HIP) программу, которая вызывает BizTalk оркестровки (orch1 - публикуется как веб-сервис WCF). Эта оркестровка вызывает orch2, которая называется другой веб-службой WCF. Я бы хотел записать/проанализировать/суммировать время ответа из приведенной выше таблицы вместо моей таблицы трассировки.
Начало программы HIP может быть определена следующим образом: , где trcProgram = 'ХИП' и trcCode = '0250' и конец программы HIP , где trcProgram = 'ХИП' и trcCode = '0299' ,
У меня подобный образец для каждого из четырех этапов, например: начать Orch1: , где trcProgram = 'Orch1' и trcCode = '0010' и конец Orch1: , где trcProgram = 'Orch1' и trcCode = '9999'.
Каждое исполнение уникально идентифицировано с помощью trcCorrGuid. Это GUID, который отмечен на всех строках, связанных с одним и тем же исполнением.
Как я могу сделать элегантный и эффективный SQL-запрос для загрузки таблицы executeHistory из таблицы трассировки? Я немного поиграл, но понял, что то, что я пишу, может быть очень неряшливым - и пройти несколько проходов - и мне нужен совет от кого-то, кто мог бы сделать что-то подобное.
Я собирался начать с получения списка Гидов. Затем я собирался сделать что-то вроде оператора CASE, но вам нужен CASE, который может обрабатывать два значения, а не один (trcProgram и trcCode). Возможно, вложенные операторы CASE будут работать?
Спасибо заранее,
Нил Walters
Update:
Вот что я работаю до сих пор:
select trace.trcDateTime,
EventName =
CASE trace.trcCode
-- HIP
WHEN '0250' THEN
CASE trace.trcProgram
WHEN 'HIP:RCT.HIP.Components:Push' THEN 'Start:HIP'
ELSE 'NA'
END
WHEN '0299' THEN
CASE trace.trcProgram
WHEN 'HIP:RCT.HIP.Components:Push' THEN 'Stop:HIP'
ELSE 'NA'
END
-- Orch 1
WHEN '0010' THEN
CASE trace.trcProgram
WHEN 'Orch:WCFSubmitPolicyAction' THEN 'Start:Orch:WCFSubmitPolicyAction'
WHEN 'Orch:CallRCTWebService' THEN 'Start:Orch:CallRCTWebService'
ELSE 'NA'
END
WHEN '9999' THEN
CASE trace.trcProgram
WHEN 'Orch:WCFSubmitPolicyAction' THEN 'Stop:Orch:WCFSubmitPolicyAction'
WHEN 'Orch:CallRCTWebService' THEN 'Stop:Orch:CallRCTWebService'
ELSE 'NA'
END
-- WebMethod Push
WHEN '1210' THEN
CASE trace.trcProgram
WHEN 'WebMethod:CreateValuationMinimal' THEN 'Start:WebMethod:CreateValuationMinimal'
ELSE 'NA'
END
WHEN '1289' THEN
CASE trace.trcProgram
WHEN 'Orch:CallRCTWebService' THEN 'Stop:WebMethod:CreateValuationMinimal'
ELSE 'NA'
END
-- WebMethod Pull
WHEN '1950' THEN
CASE trace.trcProgram
WHEN 'WebMethod:ExportValuationRecordIdCustom' THEN 'Start:WebMethod:ExportValuationRecordIdCustom'
ELSE 'NA'
END
WHEN '1951' THEN
CASE trace.trcProgram
WHEN 'WebMethod:ExportValuationRecordIdCustom' THEN 'Stop:WebMethod:ExportValuationRecordIdCustom'
ELSE 'NA'
END
ELSE 'NA'
END
from trace
я мог хранить это к временной таблице, а затем работать оттуда.
Основано на сообщении Аарона, вот что я до сих пор работал. Я должен был добавить полуколону после инструкции «use», и мне пришлось добавить «AS PivotTable» внизу.
use ESBSupport;
WITH trace_CTE AS
(
SELECT trcCorrId,
trcProgram + trcCode AS trcUniqueCode,
trcDateTime
FROM trace
WHERE (trcProgram = 'HIP:RCT.HIP.Components:Push' AND trcCode IN ('0250', '0299'))
OR (trcProgram = 'Orch:WCFSubmitPolicyAction' AND trcCode IN ('0010', '9999'))
)
SELECT
trcCorrId,
[HIP:RCT.HIP.Components:Push0250] AS startHIP,
[HIP:RCT.HIP.Components:Push0299] AS stopHIP,
[Orch:WCFSubmitPolicyAction0010] AS startOrch1,
[Orch:WCFSubmitPolicyAction9999] AS stopOrch1
-- // etc., continue this for the other events
FROM trace_CTE
PIVOT
(
MIN(trcDateTime)
FOR trcUniqueCode IN (
[HIP:RCT.HIP.Components:Push0250],
[HIP:RCT.HIP.Components:Push0299],
[Orch:WCFSubmitPolicyAction0010],
[Orch:WCFSubmitPolicyAction9999]
)
) as PivotTable
Один комментарий, который не является технически частью моего ответа: Я заметил, что ваш столбец 'trcDateTime' равен' NULL', но все ваше 'datetime 'в ваших целевых таблицах' NOT NULL'. Если вы не можете гарантировать, что эти столбцы «NULL» будут всегда содержать допустимые даты, вы должны переопределить таблицы анализа, чтобы использовать столбцы «NULL». – Aaronaught