เชœเซ‡เชจเช•เชฟเชจเซเชธเชฎเชพเช‚ เชเชธเช•เซเชฏเซเชเชฒ เชธเชฐเซเชตเชฐเชจเซเช‚ เช“เชŸเซ‹เชฎเซ‡เชถเชจ: เชชเชฐเชฟเชฃเชพเชฎ เชธเซเช‚เชฆเชฐ เชฐเซ€เชคเซ‡ เชชเชฐเชค เช•เชฐเชตเซเช‚

เชซเชฐเซ€ เชตเซเชฏเชตเชธเซเชฅเชพเชจเซ€ เชฅเซ€เชฎ เชšเชพเชฒเซ เชฐเชพเช–เชตเซ€ เชเซ€เชฐเซ‹ เชŸเชš PROD เช†เชฐเชกเซ€เชเชธ เชนเซ‡เช เชณ. เชญเชพเชตเชฟ DBAs PROD เชธเชฐเซเชตเชฐเซเชธ เชธเชพเชฅเซ‡ เชธเซ€เชงเซเช‚ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเซ€ เชถเช•เชถเซ‡ เชจเชนเซ€เช‚, เชชเชฐเช‚เชคเซ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เชถเซ‡ เชœเซ‡เชจเช•เชฟเชจเซเชธ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เช•เชพเชฎเช—เซ€เชฐเซ€ เชฎเชพเชŸเซ‡ เชจเซ‹เช•เชฐเซ€เช“. เชกเซ€เชฌเซ€เช เชจเซ‹เช•เชฐเซ€ เชถเชฐเซ‚ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชฅเซ‹เชกเชพ เชธเชฎเชฏ เชชเช›เซ€ เช† เช•เชพเชฎเช—เซ€เชฐเซ€ เชชเซ‚เชฐเซเชฃ เชฅเชตเชพเชจเชพ เช…เชนเซ‡เชตเชพเชฒ เชธเชพเชฅเซ‡เชจเซ‹ เชชเชคเซเชฐ เชฎเซ‡เชณเชตเซ‡ เช›เซ‡. เชšเชพเชฒเซ‹ เช† เชชเชฐเชฟเชฃเชพเชฎเซ‹เชจเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชธเชฎเช•เซเชท เชฐเชœเซ‚ เช•เชฐเชตเชพเชจเซ€ เชฐเซ€เชคเซ‹ เชœเซ‹เชˆเช.

เชœเซ‡เชจเช•เชฟเชจเซเชธเชฎเชพเช‚ เชเชธเช•เซเชฏเซเชเชฒ เชธเชฐเซเชตเชฐเชจเซเช‚ เช“เชŸเซ‹เชฎเซ‡เชถเชจ: เชชเชฐเชฟเชฃเชพเชฎ เชธเซเช‚เชฆเชฐ เชฐเซ€เชคเซ‡ เชชเชฐเชค เช•เชฐเชตเซเช‚

เชธเชพเชฆเซ‹ เชŸเซ‡เช•เซเชธเซเชŸ

เชšเชพเชฒเซ‹ เชธเซŒเชฅเซ€ เชคเซเชšเซเช› เชธเชพเชฅเซ‡ เชถเชฐเซ‚ เช•เชฐเซ€เช. เชชเซเชฐเชฅเชฎ เชชเชฆเซเชงเชคเชฟ เชเชŸเชฒเซ€ เชธเชฐเชณ เช›เซ‡ เช•เซ‡ เชคเซ‡เชจเชพ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช–เชฐเซ‡เช–เชฐ เช•เช‚เชˆ เชจเชฅเซ€ (เชฒเซ‡เช–เช• เชนเชตเซ‡ เชซเซเชฐเซ€เชธเซเชŸเชพเช‡เชฒ เชœเซ‹เชฌเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡):

เชœเซ‡เชจเช•เชฟเชจเซเชธเชฎเชพเช‚ เชเชธเช•เซเชฏเซเชเชฒ เชธเชฐเซเชตเชฐเชจเซเช‚ เช“เชŸเซ‹เชฎเซ‡เชถเชจ: เชชเชฐเชฟเชฃเชพเชฎ เชธเซเช‚เชฆเชฐ เชฐเซ€เชคเซ‡ เชชเชฐเชค เช•เชฐเชตเซเช‚

sqlcmd เช•เช‚เชˆเช• เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เช…เชฎเซ‡ เชคเซ‡เชจเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชธเชฎเช•เซเชท เชฐเชœเซ‚ เช•เชฐเซ€เช เช›เซ€เช. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชฌเซ‡เช•เช…เชช เชจเซ‹เช•เชฐเซ€เช“ เชฎเชพเชŸเซ‡ เช†เชฆเชฐเซเชถ:

เชœเซ‡เชจเช•เชฟเชจเซเชธเชฎเชพเช‚ เชเชธเช•เซเชฏเซเชเชฒ เชธเชฐเซเชตเชฐเชจเซเช‚ เช“เชŸเซ‹เชฎเซ‡เชถเชจ: เชชเชฐเชฟเชฃเชพเชฎ เชธเซเช‚เชฆเชฐ เชฐเซ€เชคเซ‡ เชชเชฐเชค เช•เชฐเชตเซเช‚

เชญเซ‚เชฒเชถเซ‹ เชจเชนเซ€เช‚, เชฎเชพเชฐเซเช— เชฆเซเชตเชพเชฐเชพ, RDS เชฌเซ‡เช•เช…เชช/เชฐเซ€เชธเซเชŸเซ‹เชฐ เชนเซ‡เช เชณ เช…เชธเซเชฎเซ‡เชณ เช›เซ‡, เชคเซ‡เชฅเซ€ เชคเชฎเชพเชฐเซ‡ เชคเซ‡เชจเซ€ เชฐเชพเชน เชœเซ‹เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡:

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 เชธเช˜เชจ เช•เซเชตเซ‡เชฐเซ€เชเชจเซ€ เชธเซ‚เชšเชฟ เชชเชฐเชค เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ‹ เช›เซ‹, เชคเซ‹ 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 เชธเชฐเซเชตเชฐ เชชเชฐ เชเช• เชฐเชฎเซเชœเซ€ เช•เซเชตเซ‡เชฐเซ€ เช›เซ‡ เชœเซ‡ เช›เซ‡เชฒเซเชฒเซ€ N เชฎเชฟเชจเชฟเชŸ เชฎเชพเชŸเซ‡ CPU เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เช•เชฐเซ‡ เช›เซ‡ - เชคเซ‡ เชคเชพเชฐเชฃ เช†เชชเซ‡ เช›เซ‡ เช•เซ‡ เช•เชพเชฎเชฐเซ‡เชœ เชฎเซ‡เชœเชฐเชจเซ‡ เชฌเชงเซเช‚ เชฏเชพเชฆ เช›เซ‡! เช† เช•เซเชตเชฟเช เช…เชœเชฎเชพเชตเซ€ เชœเซเช“:

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
    }

เชœเซ‡ เช†เชจเชพ เชœเซ‡เชตเซ‹ เชฆเซ‡เช–เชพเชถเซ‡:

เชœเซ‡เชจเช•เชฟเชจเซเชธเชฎเชพเช‚ เชเชธเช•เซเชฏเซเชเชฒ เชธเชฐเซเชตเชฐเชจเซเช‚ เช“เชŸเซ‹เชฎเซ‡เชถเชจ: เชชเชฐเชฟเชฃเชพเชฎ เชธเซเช‚เชฆเชฐ เชฐเซ€เชคเซ‡ เชชเชฐเชค เช•เชฐเชตเซเช‚

เชนเชพ, เชฎเชนเชพเชถเชฏ เชตเชฟเช•เซƒเชคเชฟเช“ เชตเชฟเชถเซ‡ เช˜เชฃเซเช‚ เชœเชพเชฃเซ‡ เช›เซ‡! เชคเซ‡ เชฐเชธเชชเซเชฐเชฆ เช›เซ‡ เช•เซ‡ เช† เช•เซ‹เชกเชฎเชพเช‚ เชถเชพเชฎเซ‡เชฒ เช›เซ‡: เชชเชพเชตเชฐเชถเซ‡เชฒ (เชคเซ‡เชฎเชพเช‚ เชฒเช–เชพเชฏเซ‡เชฒ), SQL, Xquery, HTML. เชคเซ‡ เช…เชซเชธเซ‹เชธเชจเซ€ เชตเชพเชค เช›เซ‡ เช•เซ‡ เช…เชฎเซ‡ เชœเชพเชตเชพเชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‡ HTML เชฎเชพเช‚ เช‰เชฎเซ‡เชฐเซ€ เชถเช•เชคเชพ เชจเชฅเซ€ (เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เชฒเช–เชตเชพ เชฎเชพเชŸเซ‡ เช›เซ‡), เชชเชฐเช‚เชคเซ เชชเชพเชฏเชฅเซ‹เชจ เช•เซ‹เชกเชจเซ‡ เชชเซ‹เชฒเชฟเชถ เช•เชฐเชตเซ‹ (เชœเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— SQL เชฎเชพเช‚ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡) เช เชฆเชฐเซ‡เช•เชจเซ€ เชซเชฐเชœ เช›เซ‡!

SQL เชชเซเชฐเซ‹เชซเชพเช‡เชฒเชฐ เชŸเซเชฐเซ‡เชธ เช†เช‰เชŸเชชเซเชŸ

เชคเซ‡ เชธเซเชชเชทเซเชŸ เช›เซ‡ เช•เซ‡ TextData เชซเซ€เชฒเซเชกเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เชŸเซเชฐเซ‡เชธ CSV เชฎเชพเช‚ เชซเชฟเชŸ เชฅเชถเซ‡ เชจเชนเซ€เช‚. เชชเชฐเช‚เชคเซ เชชเชคเซเชฐเชฎเชพเช‚ เชŸเซเชฐเซ‡เชธ เช—เซเชฐเซ€เชก เชฆเชฐเซเชถเชพเชตเชตเซเช‚ เช เชชเชฃ เชตเชฟเชšเชฟเชคเซเชฐ เช›เซ‡ - เชฌเช‚เชจเซ‡ เช•เชฆเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เช…เชจเซ‡ เช•เชพเชฐเชฃ เช•เซ‡ เช† เชกเซ‡เชŸเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชตเชงเซ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡. เชคเซ‡เชฅเซ€, เช…เชฎเซ‡ เชจเซ€เชšเซ‡ เชฎเซเชœเชฌ เช•เชฐเซ€เช เช›เซ€เช: เช…เชฎเซ‡ เชฎเชพเชฐเชซเชคเซ‡ เช•เซ‰เชฒ เช•เชฐเซ€เช เช›เซ€เช invoke-SqlCmd เชšเซ‹เช•เซเช•เชธ เชธเซเช•เซเชฐเชฟเชชเซเชŸ, เชœเซ‡เชจเซ€ เชŠเช‚เชกเชพเชˆเชฎเชพเช‚ เชคเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡

select 
  SPID,EventClass,TextData,
  Duration,Reads,Writes,CPU,
  StartTime,EndTime,DatabaseName,HostName,
  ApplicationName,LoginName
   from ::fn_trace_gettable ( @filename , default )  

เช†เช—เชณ, เชšเชพเชฒเซ เชฎเชฟเชคเซเชฐ DBA เชฆเซเชตเชพเชฐเชพ เชเช•เซเชธเซ‡เชธ เช•เชฐเซ€ เชถเช•เชพเชฏ เชคเซ‡เชตเชพ เชธเชฐเซเชตเชฐ เชชเชฐ, เช–เชพเชฒเซ€ เชจเชฎเซ‚เชจเชพ เชธเชพเชฅเซ‡เชจเซ‹ เชเช• เชŸเซเชฐเซ‡เชธเชฟเชธ เชกเซ‡เชŸเชพเชฌเซ‡เช เช›เซ‡, เชฎเซ‹เชกเซ‡เชฒ เชชเซเชฒเซ‡เชŸ, เชคเชฎเชพเชฎ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เช•เซ‰เชฒเชฎ เชธเซเชตเซ€เช•เชพเชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเซˆเชฏเชพเชฐ เช›เซ‡. เช…เชฎเซ‡ เช† เชฎเซ‹เชกเซ‡เชฒเชจเซ‡ เช…เชจเชจเซเชฏ เชจเชพเชฎ เชธเชพเชฅเซ‡ เชจเชตเชพ เชŸเซ‡เชฌเชฒ เชชเชฐ เช•เซ‰เชชเชฟ เช•เชฐเซ€เช เช›เซ€เช:

$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 

เช…เชจเซ‡ เชนเชตเซ‡ เช†เชชเชฃเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช†เชชเชฃเซเช‚ เชŸเซเชฐเซ‡เชธ เชฒเช–เซ€ เชถเช•เซ€เช เช›เซ€เช เชกเซ‡เชŸเชพ.SqlClient.SqlBulkCopy - เชฎเซ‡เช‚ เช‰เชชเชฐ เช†เชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช†เชชเซเชฏเซเช‚ เช›เซ‡. เชนเชพ, 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, เช‰เชšเซเชš เชธเซเชคเชฐเชจเซเช‚ เชตเชฟเชญเชพเชœเชจ, เชตเช—เซ‡เชฐเซ‡. เช…เชฒเชฌเชคเซเชค, เช† เชเช•เชฆเชฎ เชเชธเช•เซเชฏเซเชเชฒเชฎเชพเช‚ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชชเซเชฐเชฟเชจเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ HTML เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡ เช…เชจเซ‡ เชœเซ‡เชจเช•เชฟเชจเซเชธเชฎเชพเช‚ เชซเชพเช‡เชฒ เชชเซเชฐเช•เชพเชฐเชจเซ‡ 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>'

เชฎเซ‡เช‚ เช†เชตเซ‹ เช•เซ‹เชก เช•เซ‡เชฎ เชฒเช–เซเชฏเซ‹?

เชœเซ‡เชจเช•เชฟเชจเซเชธเชฎเชพเช‚ เชเชธเช•เซเชฏเซเชเชฒ เชธเชฐเซเชตเชฐเชจเซเช‚ เช“เชŸเซ‹เชฎเซ‡เชถเชจ: เชชเชฐเชฟเชฃเชพเชฎ เชธเซเช‚เชฆเชฐ เชฐเซ€เชคเซ‡ เชชเชฐเชค เช•เชฐเชตเซเช‚

เชชเชฐเช‚เชคเซ เชคเซเชฏเชพเช‚ เชเช• เชตเชงเซ เชธเซเช‚เชฆเชฐ เช‰เช•เซ‡เชฒ เช›เซ‡. เช•เชจเซเชตเชฐเซเชŸ เชŸเซ-เชเชšเชŸเซ€เชเชฎเชเชฒ เช…เชฎเชจเซ‡ เช•เซ‹เชทเซ‹เชจเซ‡ เชฐเช‚เช—เชตเชพ เชฆเซ‡เชคเชพ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เช…เชฎเซ‡ เชคเซ‡ เชนเช•เซ€เช•เชค เชชเช›เซ€ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช…เชฎเซ‡ 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>

เช•เซเชตเซ‡เชฐเซ€ เชฎเชพเช‚ เชœ เช†เชชเชฃเซ‡ เชเช• เชกเชฎเซ€ เช•เซ‹เชฒเชฎ เช‰เชฎเซ‡เชฐเซ€เชถเซเช‚ เชคเชฐเชค เชœ เชชเชนเซ‡เชฒเชพเช‚ เช•เซ‰เชฒเชฎ เช…เชฎเซ‡ เชฐเช‚เช— เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ‹ เช›เซ‹. เช•เซ‰เชฒเชฎ เชฌเซ‹เชฒเชพเชตเชตเซ€ เชœเซ‹เชˆเช SQLเชฎเชพเชฐเซเช•เช…เชช-เช•เช‚เชˆเช•:

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 เชชเซเชฐเชพเชชเซเชค เช•เชฐเซเชฏเชพ เชชเช›เซ€, เช…เชฎเซ‡ เชนเซ‡เชกเชฐเชฎเชพเช‚เชฅเซ€ เชกเชฎเซ€ เช•เซ‰เชฒเชฎ เชฆเซ‚เชฐ เช•เชฐเซ€เชถเซเช‚, เช…เชจเซ‡ เชกเซ‡เชŸเชพเชจเชพ เชฎเซเช–เซเชฏ เชญเชพเช—เชฎเชพเช‚ เช…เชฎเซ‡ เช•เซ‰เชฒเชฎเชฎเชพเช‚เชฅเซ€ เชธเซเชŸเชพเชˆเชฒเชฎเชพเช‚ เชฎเซ‚เชฒเซเชฏเชจเซ‡ เชธเซเชฅเชพเชจเชพเช‚เชคเชฐเชฟเชค เช•เชฐเซ€เชถเซเช‚. เช† เชซเช•เซเชค เชฌเซ‡ เช…เชตเซ‡เชœเซ€ เชธเชพเชฅเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡:

$html = $html `
  -replace "<th>SQLmarkup[^<]*</th>", "" `
  -replace "<td>SQLmarkup-(.+?)</td><td>",'<td class="SQLmarkup-$1">'

เชชเชฐเชฟเชฃเชพเชฎ:
เชœเซ‡เชจเช•เชฟเชจเซเชธเชฎเชพเช‚ เชเชธเช•เซเชฏเซเชเชฒ เชธเชฐเซเชตเชฐเชจเซเช‚ เช“เชŸเซ‹เชฎเซ‡เชถเชจ: เชชเชฐเชฟเชฃเชพเชฎ เชธเซเช‚เชฆเชฐ เชฐเซ€เชคเซ‡ เชชเชฐเชค เช•เชฐเชตเซเช‚

เชคเซ‡ เชญเชตเซเชฏ เชจเชฅเซ€? เชจเชพ เชนเซ‹เชตเชพ เช›เชคเชพเช‚, เช† เชฐเช‚เช— เชฎเชจเซ‡ เช•เช‚เชˆเช• เชฏเชพเชฆ เช…เชชเชพเชตเซ‡ เช›เซ‡
เชœเซ‡เชจเช•เชฟเชจเซเชธเชฎเชพเช‚ เชเชธเช•เซเชฏเซเชเชฒ เชธเชฐเซเชตเชฐเชจเซเช‚ เช“เชŸเซ‹เชฎเซ‡เชถเชจ: เชชเชฐเชฟเชฃเชพเชฎ เชธเซเช‚เชฆเชฐ เชฐเซ€เชคเซ‡ เชชเชฐเชค เช•เชฐเชตเซเช‚

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹