Skip to content

Instantly share code, notes, and snippets.

@sudipto80
Last active November 27, 2015 09:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sudipto80/501b5df84d5b1e6de79b to your computer and use it in GitHub Desktop.
Save sudipto80/501b5df84d5b1e6de79b to your computer and use it in GitHub Desktop.
Making Extended Events Creation SQL Beautiful
void Main()
{
string tsql = @"CREATE EVENT SESSION [CheckMyQuery] ON SERVER
ADD EVENT sqlserver.lock_acquired(SET collect_database_name=(1),collect_resource_description=(1)
ACTION(package0.collect_cpu_cycle_time,sqlos.task_time,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.server_instance_name,sqlserver.session_id,sqlserver.session_nt_username,sqlserver.sql_text,sqlserver.username)
WHERE ([sqlserver].[equal_i_sql_unicode_string]([database_name],N'MyDB'))),
ADD EVENT sqlserver.lock_released(
ACTION(sqlos.task_time,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.query_hash,sqlserver.server_instance_name,sqlserver.session_nt_username,sqlserver.sql_text,sqlserver.username)
WHERE ([sqlserver].[database_name]='MyDB')),
ADD EVENT sqlserver.lock_timeout(
ACTION(sqlos.task_time,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.query_hash,sqlserver.session_id,sqlserver.session_nt_username,sqlserver.sql_text,sqlserver.username)
WHERE ([sqlserver].[database_name]='MyDB')),
ADD EVENT sqlserver.locks_lock_waits(
ACTION(package0.process_id,sqlos.task_time,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.plan_handle,sqlserver.session_id,sqlserver.sql_text)
WHERE ([sqlserver].[database_name]='MyDB'))
ADD TARGET package0.event_file(SET filename=N'F:\CustomerData\XELFile00221.xel')
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO";
var indicesOfAction = tsql.Split(new char[]{'\r','\n',' ','(',')'},StringSplitOptions.RemoveEmptyEntries).ToList().Select ((t,i) => t == "ACTION" ? i : -1 ).Where (t => t != -1).ToList();
var indicesOfWhere = tsql.Split(new char[]{'\r','\n',' ','(',')'},StringSplitOptions.RemoveEmptyEntries).ToList().Select ((t,i) => t == "WHERE" ? i : -1 ).Where (t => t != -1).ToList();
var addEventLines = tsql.Split('\n').Where (t => t.Trim().StartsWith("ADD EVENT")).ToList();
var actionLines = tsql.Split('\n').Where (t => t.Trim().StartsWith("ACTION")).ToList();
var whereLines = tsql.Split('\n').Where (t => t.Trim().StartsWith("WHERE")).ToList();
var firstLine = tsql.Substring(0,tsql.IndexOf('\n'));
var others = new List<string>(){"ADD TARGET","WITH", "GO"};
var otherLines = tsql.Split('\n').Select (t => t.Trim()).Where (t => others.Any (ol => t.StartsWith(ol)) ).ToList();
Func<string,string> beautifyThisLine = line => line.Replace(",", "," + Environment.NewLine + "\t\t" );
Dictionary<int,int> mapping = new Dictionary <int,int>();
for(int i = 0;i<indicesOfAction.Count;i++)
{
if (!indicesOfWhere.Any (ow => Math.Abs(ow - indicesOfAction[i]) <=2))
mapping.Add(indicesOfAction[i],-1);
else
mapping.Add(indicesOfAction[i],1);
}
List<string> allLines = new List<string>();
allLines.Add(firstLine);
for(int i = 0;i<addEventLines.Count;i++)
{
allLines.Add(addEventLines[i]);
if(mapping[indicesOfAction[i]]!=-1)
{
//Club where
allLines.Add(Environment.NewLine + beautifyThisLine(actionLines[i]) + Environment.NewLine + "\t\t\t\t" + beautifyThisLine(whereLines[i>=whereLines.Count?whereLines.Count - 1:i]));
}
else
{
allLines.Add("\t\t\t\t" + beautifyThisLine(actionLines[i]));
}
}
allLines.AddRange(otherLines.Select (l => beautifyThisLine(l)));
Console.WriteLine( allLines.Aggregate ((f,s) => f + Environment.NewLine + s));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment