How to create charts from SQL Server data using PowerShell

How to create charts from SQL Server data using PowerShell

How to create charts from SQL Server data using PowerShell

SQLShack

SQL Server training Español

How to create charts from SQL Server data using PowerShell

February 8, 2018 by Jefferson Elias

Introduction

Intended audience This document is intended for application developers and database administrators who are willing to learn how to generate charts from data stored in Microsoft SQL Server using PowerShell. Context In previous article entitled Overview of PowerShell Charting capabilities we’ve seen some components of an assembly called System.Windows.Forms.DataVisualization assembly that is part of the .NET Framework and how to load it inside PowerShell. Now, it’s time to use what we’ve learned so far. We will first build a general purpose methodology for building charts. In short, we will build a template script that we will then apply to practical examples and check we can build different kinds of charts using this template.

Creating a chart general case

In next section, we will have a close look at some practical examples with sample data. While each example will show a different kind of chart, the same principle will be used all the time and it’s the subject of this section: presenting a generic script that can be specialized for each kind of chart. Creating a chart object and setting some properties Here is a generic function that will be used to build an empty chart object. We will limit to set following properties: Width Height Title Background color Title (if any) It will also optionally create a default chart area. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 Function New-Chart() { param ( [cmdletbinding()] [parameter(ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true, Mandatory = $True)] [int]$width, [parameter(ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true, Mandatory = $True)] [int]$height, [parameter(ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true, Mandatory = $False)] [string]$ChartTitle, [parameter(ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true, Mandatory = $False)] [string]$ChartTitleFont = $null, [parameter(ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true, Mandatory = $False)] [System.Drawing.ContentAlignment]$ChartTitleAlign = [System.Drawing.ContentAlignment]::TopCenter, [parameter(ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true, Mandatory = $False)] [System.Drawing.Color]$ChartColor = [System.Drawing.Color]::White, [parameter(ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true, Mandatory = $False)] [boolean]$WithChartArea = $true, [parameter(ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true, Mandatory = $False)] [boolean]$WithChartLegend = $true ) # Example: $Chart = New-Chart -width 1024 -height 800 -ChartTitle "test" $CurrentChart = New-object System.Windows.Forms.DataVisualization.Charting.Chart if($CurrentChart -eq $null) { throw "Unable to create Chart Object" } $CurrentChart.Width = $width $CurrentChart.Height = $height #TODO:$CurrentChart.Left = $LeftPadding #TODO:$CurrentChart.Top = $TopPadding $CurrentChart.BackColor = $ChartColor if($WithChartArea) { $CurrentChartArea = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea if($CurrentChartArea -eq $null) { throw "Unable to create ChartArea object" } $CurrentChart.ChartAreas.Add($CurrentChartArea) } if([String]::isNullOrEmpty($ChartTitleFont)) { $ChartTitleFont = "Arial,13pt" } if(-Not [String]::isNullOrEmpty($ChartTitle)) { [void]$CurrentChart.Titles.Add($ChartTitle) $CurrentChart.Titles[0].Font = $ChartTitleFont $CurrentChart.Titles[0].Alignment = $ChartTitleAlign } if($WithChartLegend) { $ChartLegend = New-Object system.Windows.Forms.DataVisualization.Charting.Legend $ChartLegend.name = "Chart Legend" $Chart.Legends.Add($ChartLegend) } $CurrentChart} Here is a sample call: 1 $Chart = New-Chart -width 1024 -height 800 -ChartTitle "test" Common ChartArea object creation and settings instructions In this example, a default chart area is created. We will access it using following code: 1 $Chart.ChartAreas[0] We can create one using the code from above: 123456 $CurrentChartArea = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea if($CurrentChartArea -eq $null) { throw "Unable to create CharArea object"}$CurrentChart.ChartAreas.Add($CurrentChartArea) In that case, it’s preferable to give a name to the areas: 1 $Chart.ChartAreas[0].Name = "DefaultArea" We could by the way set titles for X and Y axes of this area as follows: 12 $Chart.ChartAreas[0].AxisY.Title = "Y axis Title"$Chart.ChartAreas[0].AxisX.Title = "X axis TItle" We could also set visual attributes like the interval step to be used for one or both axes: 1 $Chart.ChartAreas[0].AxisX.Interval = 1 Or also precise the kind of data that is stored for that axis: 1 $Chart.ChartAreas[0].AxisX.IntervalType = The type of interval is a value of the enumeration called: 1 [System.Windows.Forms.DataVisualization.Charting.DateTimeIntervalType] Please, refer to documentation page for further details about axis settings. Defining a legend for our chart We can create a Legend object and add it to the $Chart object we created. 123 $ChartLegend = New-Object system.Windows.Forms.DataVisualization.Charting.Legend$ChartLegend.name = "Chart Legend"$Chart.Legends.Add($ChartLegend) The name of the Legend object instance is pretty important. We will use it when adding data series. Adding data series to an existing chart object In order to create data it’s pretty simple and straight forwards: 1 $Chart.Series.Add("MyData") As we set a name to the series, here is a mean to get back to the object quite simply: 1 $Chart.Series["MyData"] Alternately, you could use following PowerShell function: 1234567891011121314151617181920212223242526272829303132333435363738394041424344 Function New-ChartSeries() { param ( [cmdletbinding()] [parameter(ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true, Mandatory = $True)] [String]$SeriesName, [parameter(ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true, Mandatory = $False)] [int]$BorderWidth = 3, [parameter(ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true, Mandatory = $False)] [boolean]$IsVisibleInLegend = $true, [parameter(ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true, Mandatory = $False)] [string]$ChartAreaName = $null, [parameter(ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true, Mandatory = $False)] [string]$LegendName = $null, [parameter(ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true, Mandatory = $False)] [string]$HTMLColor = $null, [parameter(ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true, Mandatory = $False)] [System.Windows.Forms.DataVisualization.Charting.SeriesChartType]$ChartType = [System.Windows.Forms.DataVisualization.Charting.SeriesChartType]::Column ) $CurrentChartSeries = New-Object System.Windows.Forms.DataVisualization.Charting.Series if($CurrentChartSeries -eq $null) { throw "Unable to create Chart Series" } $CurrentChartSeries.Name = $SeriesName $CurrentChartSeries.ChartType = $ChartType $CurrentChartSeries.BorderWidth = $BorderWidth $CurrentChartSeries.IsVisibleInLegend = $IsVisibleInLegend if(-Not([string]::isNullOrEmpty($ChartAreaName))) { $CurrentChartSeries.ChartArea = $ChartAreaName } if(-Not([string]::isNullOrEmpty($LegendName))) { $CurrentChartSeries.Legend = $LegendName } if(-Not([string]::isNullOrEmpty($HTMLColor))) { $CurrentChartSeries.Color = $HTMLColor } $CurrentChartSeries} Example usage Following code will create a chart series that will be displayed as a histogram (bar columns) and add it to the $Chart object we defined previously: 12 $ChartSeries = New-ChartSeries -SeriesName "Series"$Chart.Series.Add($ChartSeries) Adding data points to a data series If we look at the Series object documentation, we will see that it has a collection object called Points that stores all the data points of the chart. This object has multiple methods to add data to it and we will review two of them: DataBindXY(,) AddXY(,) The former will allow you to bind data sets if you got all the values that go to the X axis separately from all the values that go to the Y axis. A good case usage for this is when your data is stored in a HashTable from which it’s easy to get back only keys and only values: 1234 $Chart.Series["Series"].Points.DataBindXY( $MyHashMap.Keys(), $MyHashMap.Values()) The latter will be used to add one point at a time. It’s pretty useful when you run a query that returns the (key,value) pair against SQL Server and you want to create a chart with the results of that query. In that case, we will use following algorithm: 1234567891011 $SqlQuery = "" # SELECT XAxisValue, YAxisValue ... $QueryDataSet = Invoke-SqlCmd -ServerInstance "" ` -Database "MyDb"` -Query $SqlQueryForeach ($SqlRec in $QueryDataSet) { [void]$Chart.Series["Series"].Points.AddXY ( $SqlRec.XAxisValue, $SqlRec.YAxisValue )} Displaying a chart Now we saw how to build a chart object instance and add data to it. That a good point, but we need to do something with that object and why not displaying it on screen? To do so, we will define a PowerShell function that will create a window form and add the chart to it and display. 123456789101112131415161718192021222324252627282930313233343536373839 function Display-Chart() { param ( [cmdletbinding()] [parameter(ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true, Mandatory = $True)] [System.Windows.Forms.DataVisualization.Charting.Chart]$Chart2Display, [parameter(ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true, Mandatory = $False)] [string]$Title = "New Chart", [parameter(ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true, Mandatory = $False)] [int]$width, [parameter(ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true, Mandatory = $False)] [int]$height ) if($Chart2Display -eq $null) { throw "Null value provided for Chart2Display parameter" } $Chart2Display.Anchor = [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Right -bor [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left $WindowsFormObj = New-Object Windows.Forms.Form $WindowsFormObj.Text = $Title if($width -eq $null -or $width -lt $Chart2Display.Width) { $width = $Chart2Display.Width * 1.2 } if($height -eq $null -or $height -lt $Chart2Display.Height) { $height = $Chart2Display.Height * 1.2 } $WindowsFormObj.Width = $width $WindowsFormObj.Height = $height $WindowsFormObj.Controls.Add($Chart2Display) $WindowsFormObj.Add_Shown({$WindowsFormObj.Activate()}) #$WindowsFormObj.CenterToScreen() $WindowsFormObj.ShowDialog() Out-Null} Exporting a chart to an image file Now, let’s say we just want to store the chart on disk. It’s pretty simple to accomplish using the SaveImage method from the Chart object class: 1 $Chart.SaveImage("","") The available file formats are defined in the System.Drawing.Imaging.ImageFormat class. Amongst the 12 formats defined in this class, we will find: BMP GIF JPEG PNG Putting everything together You will find below as a summary a generic template that can be used to build any kind of chart. 12345678910111213141516171819202122232425262728293031323334 # ------------------# Script Settings$ChartTitle = "test"$ChartSeriesType = [System.Windows.Forms.DataVisualization.Charting.SeriesChartType]::Column$ChartSeriesHTMLColor = $null# ------------------ #Chart object creation$Chart = New-Chart -width 1024 -height 800 -ChartTitle $ChartTitle -WithChartArea $true -WithChartLegend $false# Chart area settings$Chart.ChartAreas[0].Name = "DefaultArea"$Chart.ChartAreas[0].AxisY.Title = "Y axis Title"$Chart.ChartAreas[0].AxisX.Title = "X axis TItle" #optional settings for axes # Chart Legend$ChartLegend = New-Object system.Windows.Forms.DataVisualization.Charting.Legend$ChartLegend.name = "Chart Legend"$Chart.Legends.Add($ChartLegend) # Chart Series creation$ChartSeries = New-ChartSeries -SeriesName "Series" -LegendName "Chart Legend" –ChartAreaName "DefaultArea" -ChartType $ChartSeriesType -HTMLColor $ChartSeriesHTMLColor$Chart.Series.Add($ChartSeries) # Get back data to set in series <# Choice #1: Data Binding commands#> <# Choice #2: Points settings#># Do something with the chart object (display or save to disk)

Example usages

In following, we will use AdventureWorks database and a different T-SQL query per example. As we don’t want to give a good reading experience to our readers, we will use different queries and different data sets and generate charts. Creating a pie chart We will take data from the HumanResources.Employee table and create a pie chart that will show the number of employees by gender and marital status. This is translated to following T-SQL query: 1234567891011121314 SELECT CASE Gender WHEN 'M' THEN 'Man' WHEN 'F' THEN 'Woman' ELSE Gender END + ' ' + CASE MaritalStatus WHEN 'M' THEN 'Married' WHEN 'S' THEN 'Single' ELSE MaritalStatus END as SexAndMaritalStatus, COUNT(*)as OccurCountFROM HumanResources.EmployeeGROUP BY Gender,MaritalStatus This query gives back following results: Now, let’s build a chart object using following PowerShell script. We will use the general template and add two parameters for target server instance and database. We will choose the option of displaying the chart on screen. Here is the PowerShell code: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 # ------------------# Script Settings $ChartTitle = "Pie Chart Example"$ChartSeriesType = [System.Windows.Forms.DataVisualization.Charting.SeriesChartType]::Pie$ChartSeriesHTMLColor = $null $TargetServer = "MyServer"$TargetDatabase = "AdventureWorks" # ------------------ $PieChart = New-Chart -width 1024 -height 800 -ChartTitle $ChartTitle -WithChartArea $true -WithChartLegend $false# Chart area settings$PieChart.ChartAreas[0].Name = "DefaultArea"$PieChart.ChartAreas[0].AxisY.Title = "Gender and marital status"$PieChart.ChartAreas[0].AxisX.Title = "Count in enterprise" #optional settings for axes # Chart Legend$ChartLegend = New-Object system.Windows.Forms.DataVisualization.Charting.Legend$ChartLegend.name = "Chart Legend"$PieChart.Legends.Add($ChartLegend) # Chart Series creation$ChartSeries = New-ChartSeries -SeriesName "Series" -LegendName "Chart Legend" –ChartAreaName "DefaultArea" -ChartType $ChartSeriesType -HTMLColor $ChartSeriesHTMLColor$PieChart.Series.Add($ChartSeries) # Get back data to set in series$SqlQuery = "SELECT `r`n" + " CASE Gender `r`n" + " WHEN 'M' THEN 'Man' `r`n" + " WHEN 'F' THEN 'Woman' `r`n" + " ELSE Gender`r`n" + " END `r`n" + " + ' ' +`r`n" + " CASE MaritalStatus`r`n" + " WHEN 'M' THEN 'Married' `r`n" + " WHEN 'S' THEN 'Single' `r`n" + " ELSE MaritalStatus `r`n" + " END as SexAndMaritalStatus, COUNT(*) as OccurCount`r`n" + "FROM HumanResources.Employee`r`n" + "GROUP BY Gender,MaritalStatus`r`n" + ";" $QueryDataSet = Invoke-SqlCmd -ServerInstance $TargetServer -Database $TargetDatabase -Query $SqlQuery -ErrorAction Stop <# Choice #2: Points settings#> Foreach ($SqlRec in $QueryDataSet) { [void]$PieChart.Series["Series"].Points.AddXY( $SqlRec.SexAndMaritalStatus, $SqlRec.OccurCount )} # Do something with the chart object (display or save to disk)Display-Chart -Chart2Display $PieChart -Title "Pie Chart Example"
We can see that most employees are single men (what we could have noticed based on the results set). Creating a bar chart We will use following query and same algorithm except that we will define a Bar chart and not a Pie chart. 12345678910111213 SELECT CASE PersonType WHEN 'SC' THEN 'Store Contact' WHEN 'IN' THEN 'Individual (retail) customer' WHEN 'SP' THEN 'Sales person' WHEN 'EM' THEN 'Employee (non-sales)' WHEN 'VC' THEN 'Vendor Contact' ELSE 'General Contact' END as PersonType, COUNT(*) PersonCount FROM Person.PersonGROUP BY PersonType; This query gives back following results set: Here is the corresponding PowerShell Code: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 # ------------------# Script Settings $ChartTitle = "Bar Chart Example"$ChartSeriesType = [System.Windows.Forms.DataVisualization.Charting.SeriesChartType]::Bar$ChartSeriesHTMLColor = $null $TargetServer = "MyServer"$TargetDatabase = "AdventureWorks" # ------------------ $BarChart = New-Chart -width 1024 -height 800 -ChartTitle $ChartTitle -WithChartArea $true -WithChartLegend $false# Chart area settings$BarChart.ChartAreas[0].Name = "DefaultArea"$BarChart.ChartAreas[0].AxisY.Title = "Count in enterprise"$BarChart.ChartAreas[0].AxisX.Title = "Kind of person" #optional settings for axes # Chart Legend$ChartLegend = New-Object system.Windows.Forms.DataVisualization.Charting.Legend$ChartLegend.name = "Chart Legend"$BarChart.Legends.Add($ChartLegend) # Chart Series creation$ChartSeries = New-ChartSeries -SeriesName "Series" -LegendName "Chart Legend" –ChartAreaName "DefaultArea" -ChartType $ChartSeriesType -HTMLColor $ChartSeriesHTMLColor$BarChart.Series.Add($ChartSeries) # Get back data to set in series$SqlQuery = "SELECT `r`n" + " CASE PersonType`r`n" + " WHEN 'SC' THEN 'Store Contact'`r`n" + " WHEN 'IN' THEN 'Individual (retail) customer'`r`n" + " WHEN 'SP' THEN 'Sales person'`r`n" + " WHEN 'EM' THEN 'Employee (non-sales)'`r`n" + " WHEN 'VC' THEN 'Vendor Contact'`r`n" + " ELSE 'General Contact'`r`n" + " END as PersonType, `r`n" + " COUNT(*) PersonCount `r`n" + "FROM Person.Person`r`n" + "GROUP BY PersonType`r`n" + ";" $QueryDataSet = Invoke-SqlCmd -ServerInstance $TargetServer -Database $TargetDatabase -Query $SqlQuery -ErrorAction Stop <# Choice #2: Points settings#> Foreach ($SqlRec in $QueryDataSet) { [void]$BarChart.Series["Series"].Points.AddXY( $SqlRec.PersonType, $SqlRec.PersonCount )} # Do something with the chart object (display or save to disk)Display-Chart -Chart2Display $BarChart -Title "Bar Chart Example" And here is the corresponding chart: If you take a closer look to the code, you see that, except the query that is different, the only line that has changed is the assignment to the $ChartSeriesType variable. Going further These two examples will give you, I hope so, the knowledge necessary to be able to create advanced charts with multiple chart areas and/or multiple series into the same chart. As a last advice, don’t forget that a chart area will need you to define the same values for X axis along all the series when you want to plot something like this: In this example, I set values of 0 for occurrences of LOG backups in the “FULL-WITH-LOG backups occurrences” series and 0 for occurrences of FULL-WITH-LOG backups in the “LOG backups occurrences” series. By the way, if you are willing to get a more in-depth knowledge on the DataVisualization namespace, there are two ways to do so. Firstly, you can go through the documentation and test yourself on concrete examples (that would add some value to your job, it’s always a better way to learn). Secondly, you could also get into Visual Studio, try to build charts using WYSIWYG tools and look at the code used behind. Previous article in this series: Overview of PowerShell Charting capabilities
Author Recent Posts Jefferson EliasLiving in Belgium, I obtained a master degree in Computer Sciences in 2011 at the University of Liege.

I'm one of the rare guys out there who started to work as a DBA immediately after his graduation. So, I work at the university hospital of Liege since 2011. Initially involved in Oracle Database administration (which are still under my charge), I had the opportunity to learn and manage SQL Server instances in 2013. Since 2013, I've learned a lot about SQL Server in administration and development.

I like the job of DBA because you need to have a general knowledge in every field of IT. That's the reason why I won't stop learning (and share) the products of my learnings.

View all posts by Jefferson Elias Latest posts by Jefferson Elias (see all) How to perform a performance test against a SQL Server instance - September 14, 2018 Concurrency problems – theory and experimentation in SQL Server - July 24, 2018 How to link two SQL Server instances with Kerberos - July 5, 2018

Related posts

Power BI Desktop Pulse Charts Power BI desktop Mekko Charts Candlestick chart for stock data analysis in Power BI Desktop Exploring the SandDance Visualizations extension in Azure Data Studio Create charts from SQL Server data using Azure Data Studio 7,353 Views

Follow us

Popular

SQL Convert Date functions and formats SQL Variables: Basics and usage SQL PARTITION BY Clause overview Different ways to SQL delete duplicate rows from a SQL Table How to UPDATE from a SELECT statement in SQL Server SQL Server functions for converting a String to a Date SELECT INTO TEMP TABLE statement in SQL Server SQL WHILE loop with simple examples How to backup and restore MySQL databases using the mysqldump command CASE statement in SQL Overview of SQL RANK functions Understanding the SQL MERGE statement INSERT INTO SELECT statement overview and examples SQL multiple joins for beginners with examples Understanding the SQL Decimal data type DELETE CASCADE and UPDATE CASCADE in SQL Server foreign key SQL Not Equal Operator introduction and examples SQL CROSS JOIN with examples The Table Variable in SQL Server SQL Server table hints – WITH (NOLOCK) best practices

Trending

SQL Server Transaction Log Backup, Truncate and Shrink Operations Six different methods to copy tables between databases in SQL Server How to implement error handling in SQL Server Working with the SQL Server command line (sqlcmd) Methods to avoid the SQL divide by zero error Query optimization techniques in SQL Server: tips and tricks How to create and configure a linked server in SQL Server Management Studio SQL replace: How to replace ASCII special characters in SQL Server How to identify slow running queries in SQL Server SQL varchar data type deep dive How to implement array-like functionality in SQL Server All about locking in SQL Server SQL Server stored procedures for beginners Database table partitioning in SQL Server How to drop temp tables in SQL Server How to determine free space and file size for SQL Server databases Using PowerShell to split a string into an array KILL SPID command in SQL Server How to install SQL Server Express edition SQL Union overview, usage and examples

Solutions

Read a SQL Server transaction logSQL Server database auditing techniquesHow to recover SQL Server data from accidental UPDATE and DELETE operationsHow to quickly search for SQL database data and objectsSynchronize SQL Server databases in different remote sourcesRecover SQL data from a dropped table without backupsHow to restore specific table(s) from a SQL Server database backupRecover deleted SQL data from transaction logsHow to recover SQL Server data from accidental updates without backupsAutomatically compare and synchronize SQL Server dataOpen LDF file and view LDF file contentQuickly convert SQL code to language-specific client codeHow to recover a single table from a SQL Server database backupRecover data lost due to a TRUNCATE operation without backupsHow to recover SQL Server data from accidental DELETE, TRUNCATE and DROP operationsReverting your SQL Server database back to a specific point in timeHow to create SSIS package documentationMigrate a SQL Server database to a newer version of SQL ServerHow to restore a SQL Server database backup to an older version of SQL Server

Categories and tips

►Auditing and compliance (50) Auditing (40) Data classification (1) Data masking (9) Azure (295) Azure Data Studio (46) Backup and restore (108) ►Business Intelligence (482) Analysis Services (SSAS) (47) Biml (10) Data Mining (14) Data Quality Services (4) Data Tools (SSDT) (13) Data Warehouse (16) Excel (20) General (39) Integration Services (SSIS) (125) Master Data Services (6) OLAP cube (15) PowerBI (95) Reporting Services (SSRS) (67) Data science (21) ►Database design (233) Clustering (16) Common Table Expressions (CTE) (11) Concurrency (1) Constraints (8) Data types (11) FILESTREAM (22) General database design (104) Partitioning (13) Relationships and dependencies (12) Temporal tables (12) Views (16) ►Database development (418) Comparison (4) Continuous delivery (CD) (5) Continuous integration (CI) (11) Development (146) Functions (106) Hyper-V (1) Search (10) Source Control (15) SQL unit testing (23) Stored procedures (34) String Concatenation (2) Synonyms (1) Team Explorer (2) Testing (35) Visual Studio (14) DBAtools (35) DevOps (23) DevSecOps (2) Documentation (22) ETL (76) ►Features (213) Adaptive query processing (11) Bulk insert (16) Database mail (10) DBCC (7) Experimentation Assistant (DEA) (3) High Availability (36) Query store (10) Replication (40) Transaction log (59) Transparent Data Encryption (TDE) (21) Importing, exporting (51) Installation, setup and configuration (121) Jobs (42) ▼Languages and coding (686) Cursors (9) DDL (9) DML (6) JSON (17) PowerShell (77) Python (37) R (16) SQL commands (196) SQLCMD (7) String functions (21) T-SQL (275) XML (15) Lists (12) Machine learning (37) Maintenance (99) Migration (50) Miscellaneous (1) ►Performance tuning (869) Alerting (8) Always On Availability Groups (82) Buffer Pool Extension (BPE) (9) Columnstore index (9) Deadlocks (16) Execution plans (125) In-Memory OLTP (22) Indexes (79) Latches (5) Locking (10) Monitoring (100) Performance (196) Performance counters (28) Performance Testing (9) Query analysis (121) Reports (20) SSAS monitoring (3) SSIS monitoring (10) SSRS monitoring (4) Wait types (11) ►Professional development (68) Professional development (27) Project management (9) SQL interview questions (32) Recovery (33) Security (84) Server management (24) SQL Azure (271) SQL Server Management Studio (SSMS) (90) SQL Server on Linux (21) ►SQL Server versions (177) SQL Server 2012 (6) SQL Server 2016 (63) SQL Server 2017 (49) SQL Server 2019 (57) SQL Server 2022 (2) ►Technologies (334) AWS (45) AWS RDS (56) Azure Cosmos DB (28) Containers (12) Docker (9) Graph database (13) Kerberos (2) Kubernetes (1) Linux (44) LocalDB (2) MySQL (49) Oracle (10) PolyBase (10) PostgreSQL (36) SharePoint (4) Ubuntu (13) Uncategorized (4) Utilities (21) Helpers and best practices BI performance counters SQL code smells rules SQL Server wait types © 2022 Quest Software Inc. ALL RIGHTS RESERVED. GDPR Terms of Use Privacy
0 comments

Comments (0)

Leave a Comment

Minimum 10 characters required

* All fields are required. Comments are moderated before appearing.

No comments yet. Be the first to comment!