Π‘Π½ΠΎΠ²Π°
Plain Text
ΠΠ°ΡΠ½Π΅ΠΌ Ρ ΡΠ°ΠΌΠΎΠ³ΠΎ ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ. ΠΠ΅ΡΠ²ΡΠΉ ΡΠΏΠΎΡΠΎΠ± Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΡΡ, ΡΡΠΎ ΠΈ Π³ΠΎΠ²ΠΎΡΠΈΡΡ, Π² ΠΎΠ±ΡΠ΅ΠΌ ΡΠΎ, Π½Π΅ ΠΎ ΡΠ΅ΠΌ (Π°Π²ΡΠΎΡ Π·Π΄Π΅ΡΡ ΠΈ Π΄Π°Π»Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ FreeStyle jobs):
sqlcmd ΡΡΠΎ-ΡΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ, ΠΈ ΠΌΡ ΠΏΡΠ΅Π·Π΅Π½ΡΡΠ΅ΠΌ ΡΡΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. ΠΠ΄Π΅Π°Π»ΡΠ½ΠΎ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ Π΄Π»Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, backup jobs:
ΠΠ΅ Π·Π°Π±ΡΠ²Π°Π΅ΠΌ, ΠΊΡΡΠ°ΡΠΈ, ΡΡΠΎ ΠΏΠΎΠ΄ RDS backup/restore Π°ΡΠ½ΠΈΡ
ΡΠΎΠ½Π΅Π½, ΠΏΠΎΡΡΠΎΠΌΡ Π½Π°Π΄ΠΎ Π±Ρ Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°ΡΡ:
declare @rds table
(id int, task_type varchar(128), database_name sysname, pct int, duration int,
lifecycle varchar(128), taskinfo varchar(max) null,
upd datetime, cre datetime,
s3 varchar(256), ovr int, KMS varchar(256) null)
waitfor delay '00:00:20'
insert into @rds exec msdb.dbo.rds_task_status @db_name='{db}'
select @xid=max(id) from @rds
again:
waitfor delay '00:00:02'
delete from @rds
insert into @rds exec msdb.dbo.rds_task_status @db_name='{db}'
# {db} substituted with db name by powershell
select @stat=lifecycle,@info=taskinfo from @rds where id=@xid
if @stat not in ('ERROR','SUCCESS','CANCELLED') goto again
ΠΡΠΎΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ±, CSV
ΠΠ΄Π΅ΡΡ Π²ΡΠ΅ ΡΠΎΠΆΠ΅ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ:
ΠΠ΄Π½Π°ΠΊΠΎ ΡΡΠΎΡ ΡΠΏΠΎΡΠΎΠ± ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ, Π΅ΡΠ»ΠΈ Π΄Π°Π½Π½ΡΠ΅, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ Π² CSV, Β«ΠΏΡΠΎΡΡΡΠ΅Β». ΠΡΠ»ΠΈ Π²Ρ ΠΏΠΎΠΏΡΡΠ°Π΅ΡΠ΅ΡΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π²Π΅ΡΠ½ΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΏΠΈΡΠΎΠΊ TOP N CPU intensive queries, ΡΠΎ CSV Β«ΡΠ°Π·ΡΠ΅Π΄Π΅ΡΡΡΒ» ΠΈΠ·-Π·Π° ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΡΠ΅ΠΊΡΡ Π·Π°ΠΏΡΠΎΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π»ΡΠ±ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ β Π·Π°ΠΏΡΡΡΠ΅, ΠΊΠ°Π²ΡΡΠΊΠΈ, ΠΈ Π΄Π°ΠΆΠ΅ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Ρ ΡΡΡΠΎΠΊ. ΠΠΎΡΡΠΎΠΌΡ Π½Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΡΠΎ-ΡΠΎ ΠΏΠΎΡΠ»ΠΎΠΆΠ½Π΅Π΅.
ΠΡΠ°ΡΠΈΠ²ΡΠ΅ ΡΠ°Π±Π»ΠΈΡΠΊΠΈ Π½Π° HTML
ΠΡΠΈΠ²Π΅Π΄Ρ ΡΡΠ°Π·Ρ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΊΠΎΠ΄Π°
$Header = @"
<style>
TABLE {border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse;}
TH {border-width: 1px; padding: 3px; border-style: solid; border-color: black; background-color: #6495ED;}
TD {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
</style>
"@
$Result = invoke-Sqlcmd -ConnectionString $jstr -Query "select * from DbInv" `
| Select-Object -Property * -ExcludeProperty "ItemArray", "RowError", "RowState", "Table", "HasErrors"
if ($Result -eq $null) { $cnt = 0; }
elseif ($Result.getType().FullName -eq "System.Management.Automation.PSCustomObject") { $cnt = 1; }
else { $cnt = $Result.Rows.Count; }
if ($cnt -gt 0) {
$body = "<h2>My table</h2>"
$Result | ConvertTo-HTML -Title "Rows" -Head $header -body $body `
| Out-File "res.log" -Append -Encoding UTF8
} else {
"<h3>No data</h3>" | Out-File "res.log" -Append -Encoding UTF8
}
ΠΡΡΠ°ΡΠΈ, ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΡΡΠΎΠΊΡ Ρ System.Management.Automation.PSCustomObject, ΠΎΠ½Π° ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠ°Ρ, Π΅ΡΠ»ΠΈ Π² Π³ΡΠΈΠ΄Π΅ ΡΠΎΠ²Π½ΠΎ ΠΎΠ΄Π½Π° ΡΡΡΠΎΠΊΠ°, ΡΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. Π Π΅ΡΠ΅Π½ΠΈΠ΅ Π²Π·ΡΡΠΎ ΠΈΠ· ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ° ΠΎΡΠΎΠ±ΠΎ Π½Π΅ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡΡ. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π²Ρ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π²ΡΠ²ΠΎΠ΄, ΠΎΡΠΎΡΠΌΠ»Π΅Π½Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊ:
Π ΠΈΡΡΠ΅ΠΌ Π³ΡΠ°ΡΠΈΠΊΠΈ
ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠΈΠ·Π²ΡΠ°ΡΠ΅Π½Π½ΡΠΉ ΠΊΠΎΠ΄ Π½ΠΈΠΆΠ΅!
ΠΡΡΡ Π·Π°Π±Π°Π²Π½ΡΠΉ Π·Π°ΠΏΡΠΎΡ Π½Π° SQL ΡΠ΅ΡΠ²Π΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ²ΠΎΠ΄ΠΈΡ CPU Π·Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ N ΠΌΠΈΠ½ΡΡ β ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ, ΡΠΎΠ²Π°ΡΠΈΡ ΠΌΠ°ΠΉΠΎΡ Π²ΡΠ΅ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ! ΠΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΡΡΡ ΠΊΠ²Π΅ΡΡ:
DECLARE @ts_now bigint = (SELECT cpu_ticks/(cpu_ticks/ms_ticks)
FROM sys.dm_os_sys_info WITH (NOLOCK));
SELECT TOP(256)
DATEADD(ms, -1 * (@ts_now - [timestamp]), GETDATE()) AS [EventTime],
SQLProcessUtilization AS [SQLCPU],
100 - SystemIdle - SQLProcessUtilization AS [OtherCPU]
FROM (SELECT record.value('(./Record/@id)[1]', 'int') AS record_id,
record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int')
AS [SystemIdle],
record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int')
AS [SQLProcessUtilization], [timestamp]
FROM (SELECT [timestamp], CONVERT(xml, record) AS [record]
FROM sys.dm_os_ring_buffers WITH (NOLOCK)
WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR'
AND record LIKE N'%<SystemHealth>%') AS x) AS y
ORDER BY 1 DESC OPTION (RECOMPILE);
Π’Π΅ΠΏΠ΅ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ°ΠΊΠΎΠ΅ ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ (ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ $Fragment)
<table style="width: 100%"><tbody><tr style="background-color: white; height: 2pt;">
<td style="width: SQLCPU%; background-color: green;"></td>
<td style="width: OtherCPU%; background-color: blue;"></td>
<td style="width: REST%; background-color: #C0C0C0;"></td></tr></tbody>
</table>
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅Π»ΠΎ ΠΏΠΈΡΡΠΌΠ°:
$Result = invoke-Sqlcmd -ConnectionString $connstr -Query $Query `
| Select-Object -Property * -ExcludeProperty `
"ItemArray", "RowError", "RowState", "Table", "HasErrors"
if ($Result.HasRows) {
foreach($item in $Result)
{
$time = $itemEventTime
$sqlcpu = $item.SQLCPU
$other = $itemOtherCPU
$rest = 100 - $sqlcpu - $other
$f = $fragment -replace "SQLCPU", $sqlcpu
$f = $f -replace "OtherCPU", $other
$f = $f -replace "REST", $rest
$f | Out-File "res.log" -Append -Encoding UTF8
}
ΠΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ°ΠΊ:
Π’Π°ΠΊΠΈ Π΄Π°, ΠΌΠ΅ΡΡΠ΅ Π·Π½Π°Π΅Ρ ΡΠΎΠ»ΠΊ Π² ΠΈΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΡΡ
! ΠΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ, ΡΡΠΎ Π΄Π°Π½Π½ΡΠΉ ΠΊΠΎΠ΄ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π² ΡΠ΅Π±Π΅: Powershell (Π½Π° Π½Π΅ΠΌ ΠΈ Π½Π°ΠΏΠΈΡΠ°Π½), SQL, Xquery, HTML. ΠΠ°Π»Ρ ΡΡΠΎ ΠΊ HTML ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Javascript (ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΡΠΎ Π΄Π»Ρ ΠΏΠΈΡΡΠΌΠ°), Π½ΠΎ ΡΠ»ΠΈΡΠ°Π½ΡΡΡ ΠΊΠΎΠ΄ Python (ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² SQL) Π΄ΠΎΠ»Π³ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ!
ΠΡΠ²ΠΎΠ΄ SQL profiler trace
ΠΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ ΡΡΠ΅ΠΉΡ Β«Π½Π΅ Π·Π°Π»Π΅Π·Π΅ΡΒ» Π² CSV ΠΈΠ·-Π·Π° ΠΏΠΎΠ»Ρ TextData. ΠΠΎ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΡΡΠ΅ΠΉΡ Π³ΡΠΈΠ΄ΠΎΠΌ Π² ΠΏΠΈΡΡΠΌΠ΅ ΡΠΎΠΆΠ΅ ΡΡΡΠ°Π½Π½ΠΎ β ΠΈ ΠΈΠ·-Π·Π° ΡΠ°Π·ΠΌΠ΅ΡΠ°, ΠΈ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ ΡΠ°ΡΡΠΎ ΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅Π³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°. ΠΠΎΡΡΠΎΠΌΡ ΠΌΡ Π΄Π΅Π»Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅: Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΠ΅ΡΠ΅Π· invoke-SqlCmd Π½Π΅ΠΊΠΈΠΉ ΡΠΊΡΠΈΠΏΡ, Π² Π½Π΅Π΄ΡΠ°Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ
select
SPID,EventClass,TextData,
Duration,Reads,Writes,CPU,
StartTime,EndTime,DatabaseName,HostName,
ApplicationName,LoginName
from ::fn_trace_gettable ( @filename , default )
ΠΠ°Π»Π΅Π΅, Π½Π° Π΄ΡΡΠ³ΠΎΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ΅, Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠΌ DBA, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π±Π°Π·Π° Traces Ρ ΠΏΡΡΡΠΎΠΉ Π·Π°Π³ΠΎΡΠΎΠ²ΠΊΠΎΠΉ, ΡΠ°Π±Π»ΠΈΡΠΊΠΎΠΉ Model, Π³ΠΎΡΠΎΠ²ΠΎΠΉ ΠΏΡΠΈΠ½ΡΡΡ Π²ΡΠ΅ ΡΠΊΠ°Π·Π°Π½Π½ΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ. ΠΡ ΡΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ Π² Π½ΠΎΠ²ΡΡ ΡΠ°Π±Π»ΠΈΡΡ Ρ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ:
$dt = Get-Date -format "yyyyMMdd"
$tm = Get-Date -format "hhmmss"
$tableName = $srv + "_" + $dt + "_" + $tm
$copytab = "select * into " + $tableName + " from Model"
invoke-SqlCmd -ConnectionString $tstr -Query $copytab
Π ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π² Π½Π΅Π΅ Π·Π°ΠΏΠΈΡΠ°ΡΡ Π½Π°Ρ ΡΡΠ΅ΠΉΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Data.SqlClient.SqlBulkCopy β ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΠΎΠ³ΠΎ Ρ ΡΠΆΠ΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠ» Π²ΡΡΠ΅. ΠΠ°, Π΅ΡΠ΅ Π½Π΅ΠΏΠ»ΠΎΡ ΠΎ Π±Ρ ΡΠ΄Π΅Π»Π°ΡΡ masking ΠΊΠΎΠ½ΡΡΠ°Π½Ρ Π² TextData:
# mask data
foreach ($Row in $Result)
{
$v = $Row["TextData"]
$v = $v -replace "'([^']{2,})'", "'str'" -replace "[0-9][0-9]+", '999'
$Row["TextData"] = $v
}
ΠΡ Π·Π°ΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΠΈΡΠ»Π° Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ Π² ΠΎΠ΄ΠΈΠ½ ΡΠΈΠΌΠ²ΠΎΠ» Π΄Π»ΠΈΠ½ΠΎΠΉ Π½Π° 999, Π° ΡΡΡΠΎΠΊΠΈ Π΄Π»ΠΈΠ½Π½Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° ΠΌΡ Π·Π°ΠΌΠ΅Π½ΡΠ΅ΠΌ Π½Π° ‘str’. Π§ΠΈΡΠ»Π° ΠΎΡ 0 Π΄ΠΎ 9 ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΊΠ°ΠΊ ΡΠ»Π°Π³ΠΈ, ΠΈ ΠΌΡ ΠΈΡ Π½Π΅ ΡΡΠΎΠ³Π°Π΅ΠΌ, ΡΠ°Π²Π½ΠΎ ΠΊΠ°ΠΊ ΠΈ ΠΏΡΡΡΡΠ΅ ΠΈ ΠΎΠ΄Π½ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ β ΡΡΠ΅Π΄ΠΈ Π½ΠΈΡ ΡΠ°ΡΡΠΎ Π²ΡΡΡΠ΅ΡΠ°ΡΡΡΡ ‘Y’, ‘N’ ΠΈΡΠ΄.
ΠΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΡΠ°ΡΠΎΠΊ Π² Π½Π°ΡΡ ΠΆΠΈΠ·Π½Ρ (ΡΡΡΠΎΠ³ΠΎ 18+)
Π ΡΠ°Π±Π»ΠΈΡΠΊΠ°Ρ ΡΠ°ΡΡΠΎ Ρ ΠΎΡΠ΅ΡΡΡ Π²ΡΠ΄Π΅Π»ΠΈΡΡ ΡΡΠ΅ΠΉΠΊΠΈ, ΡΡΠ΅Π±ΡΡΡΠΈΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, FAILS, Π²ΡΡΠΎΠΊΠΈΠΉ ΡΡΠΎΠ²Π΅Π½Ρ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΈΡΠ΄. ΠΠΎΠ½Π΅ΡΠ½ΠΎ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΈ Π½Π° Π³ΠΎΠ»ΠΎΠΌ SQL, ΡΠΎΡΠΌΠΈΡΡΡ HTML Ρ ΠΏΠΎΠΌΠΎΡΡΡ PRINT, Π° Π² Jenkins ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ ΡΠΈΠΏ ΡΠ°ΠΉΠ»Π° HTML:
declare @body varchar(max), @chunk varchar(max)
set @body='<font face="Lucida Console" size="3">'
set @body=@body+'<b>Server name: '+@@servername+'</b><br>'
set @body=@body+'<br><br>'
set @body=@body+'<table><tr><th>Job</th><th>Last Run</th><th>Avg Duration, sec</th><th>Last Run, Sec</th><th>Last Status</th></tr>'
print @body
DECLARE tab CURSOR FOR SELECT '<tr><td>'+name+'</td><td>'+
LastRun+'</td><td>'+
convert(varchar,AvgDuration)+'</td><td>'+
convert(varchar,LastDuration)+'</td><td>'+
case when LastStatus<>'Succeeded' then '<font color="red">' else '' end+
LastStatus+
case when LastStatus<>'Succeeded' then '</font>' else '' end+
+'</td><td>'
from #j2
OPEN tab;
FETCH NEXT FROM tab into @chunk
WHILE @@FETCH_STATUS = 0
BEGIN
print @chunk
FETCH NEXT FROM tab into @chunk;
END
CLOSE tab;
DEALLOCATE tab;
print '</table>'
ΠΠ°ΡΠ΅ΠΌ Ρ Π½Π°ΠΏΠΈΡΠ°Π» ΡΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ΄?
ΠΠΎ Π΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΊΡΠ°ΡΠΈΠ²ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅. ConvertTo-HTML Π½Π΅ Π΄Π°Π΅Ρ Π½Π°ΠΌ ΡΠ°ΡΠΊΡΠ°ΡΠΈΡΡ ΠΊΠ»Π΅ΡΠΊΠΈ, Π½ΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ ΠΏΠΎΡΡΡΠ°ΠΊΡΡΠΌ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΡ Ρ
ΠΎΡΠΈΠΌ Π²ΡΠ΄Π΅Π»ΠΈΡΡ ΠΊΠ»Π΅ΡΠΊΠΈ Ρ ΡΡΠΎΠ²Π½Π΅ΠΌ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π±ΠΎΠ»Π΅Π΅ 80 ΠΈ Π±ΠΎΠ»Π΅Π΅ 90. ΠΠΎΠ±Π°Π²ΠΈΠΌ ΡΡΠΈΠ»ΠΈ:
<style>
.SQLmarkup-red { color: red; background-color: yellow; }
.SQLmarkup-yellow { color: black; background-color: #FFFFE0; }
.SQLmarkup-default { color: black; background-color: white; }
</style>
Π ΡΠ°ΠΌΠΎΠΉ ΠΊΠ²Π΅ΡΠΈ ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠΈΠΊΡΠΈΠ²Π½ΡΡ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π΄ΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΡ Ρ ΠΎΡΠΈΠΌ ΡΠ°ΡΠΊΡΠ°ΡΠΈΡΡ. ΠΠΎΠ»ΠΎΠ½ΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π½Π°Π·ΡΠ²Π°ΡΡΡΡ SQLmarkup-ΡΡΠΎ-ΡΠΎ:
case
when ps.avg_fragmentation_in_percent>=90.0 then 'SQLmarkup-red'
when ps.avg_fragmentation_in_percent>=80.0 then 'SQLmarkup-yellow'
else 'SQLmarkup-default'
end as [SQLmarkup-1],
ps.avg_fragmentation_in_percent,
Π’Π΅ΠΏΠ΅ΡΡ, ΠΏΠΎΠ»ΡΡΠΈΠ² HTML, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Powershell, ΠΌΡ ΡΠ±Π΅ΡΠ΅ΠΌ ΡΠΈΠΊΡΠΈΠ²Π½ΡΡ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡ ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°, Π° Π² ΡΠ΅Π»Π΅ Π΄Π°Π½Π½ΡΡ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ Π² ΡΡΠΈΠ»Ρ. ΠΡΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ Π²ΡΠ΅Π³ΠΎ Π΄Π²ΡΠΌΡ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°ΠΌΠΈ:
$html = $html `
-replace "<th>SQLmarkup[^<]*</th>", "" `
-replace "<td>SQLmarkup-(.+?)</td><td>",'<td class="SQLmarkup-$1">'
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ:
ΠΠ΅ ΠΏΡΠ°Π²Π΄Π° Π»ΠΈ, ΡΠ»Π΅Π³Π°Π½ΡΠ½ΠΎ? Π₯ΠΎΡΡ Π½Π΅Ρ, ΡΡΠΎ-ΡΠΎ ΡΡΠ° ΡΠ°ΡΠΊΡΠ°ΡΠΊΠ° ΠΌΠ½Π΅ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com