From 34702f73df14a2f1f1090bb39ddbcce44e8bcc50 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Wed, 20 May 2020 10:28:15 -0400 Subject: [PATCH 001/116] Create Get-RsRestFolderContent.ps1 Initial commit of REST version of the Get-RsFolderContent function. --- .../Rest/Get-RsRestFolderContent.ps1 | Bin 0 -> 11186 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestFolderContent.ps1 diff --git a/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestFolderContent.ps1 b/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestFolderContent.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..d02825e9650985e95cfa27ba4b2780edccf8ffd9 GIT binary patch literal 11186 zcmds7TW=Fr5I)b9`X5$_r6g+N0FS6?OCS^@0%;sbs|ZoY7jSXnU^~zh@z>ja-;9Sn zyFO>vYbSX?mM^VInLd7#;L?k=c5;Muef{Swjj+IZ^|%nk0I+| z%7J>E;~e=^>9ilSoBWTeF?*wmJvJcDA z);*D~EjsdQM{L;=x*>EKftoTW_|=8Xw6xl20=W|$C!pZj7OoEA!vt%S<_y1jxN9iC z%!;&t`i$J0I8uL%MEZ~hb@#~af$|}&*MP1^_x*C_|-4;f6NBi==0Z1+)G&bnb?DIeFc7ue#Yo;a^8ngw|O1NgM>USWk1)>Hq5R8#L z?Lp3tDDSsWJn6FRb7}=yCh7pC&airL-9#v|~Am8Vyw`tL;S{{SXsl>~8DSt92 z(-llR%{}!Q{gi5X27A7TRaHA?JS$~tmv|%;X}ITp7rZ(^p6nIoWwlzENYza9%+FWF zfW)oAgA=?i5P92p8OjZ&m^HyUMuOEGTFffW8)*Ikcd*a6i_bOKO6#%fVIta&C}SRK~fCf?+!NAY!-sq9{ez*(J)S8b--+YIU$)_V-JXa2LJkFU=v$L@wP zuB*pZn@8FdU1t%xX!Wd3Lp{#gjOWctCtfF_GYK<%0`K_U$FhFVX)Pp~Mvl*GeobSz z6zYA(h^x33O~f!Giqlqo8s9BM7LT>_sUvbPLBT1EcCsm%Gh>KfEM`KqMHpp-c1N_*2gyomNbjbdPE5+OzDj3wi=kbt`Brk#kN)iR zZM3ziR9QJR3Z7$~Pt(qUQqRi!1ZM~6L8v>c%r11+Iy{S0#Q7R*)hwa%Wlp8^V{0}W zRbIafo2ALi8nP)R44n_ll$|UMJI7xuxngjc6IWh*AU6NZc{vM zyC~MX+=RxeRbJD(Q%ytqJPOK~)#yt`Ked2Px8ux}aMrMTTxIAiQp5Ci^%(cDigl4I zI`y8yj;vOUfyemP3TKlH(T-j;t8?dx6`paL-#e)TVd@dT8UGsUV>m8+51t@L{rY$x zGYBV#(G+Xf!M%8$&7g!?lrov@oBKN4b*u&Po9MzRmYSafV~DZE>lJ&#xYnQ*5}DP?>_OUn@g;Yh*n28g@q7qxVmL(lP{ksB_?H{T<=8M`COSmIVs>qUZLE@vd0ia*Id6A zZ8m_2>26+;Jc_Gb_>&Wc;!s#ZohWI`@b&Sv;8Kc)VJ@kq8Ds1ywSuI(94jSqn0M#P zQln1gVxN*uTg6yxciVS0o_5zNbkrw0ZQycR3w1WnPUc0vw)OJgHRK7WeAYVKE3*Dd zqjCja*S!(;N#}?bn>^UL#p_}n&viJ}cj1$4ACi|Lc3j*!uzTme0Ig%agKrN;E2WF; zmzQf1`_Vs~(YR-)`_Alih%H3I?EcJk`ONS6t#kJMr%i=lHez1yfTMJ@Zmoy|YSKhStmQG7Kr>WpvB%Y63_8ftAX58Qn6x_N6CgW#R1E z!TvzHgBi1D=$`A8L1)Nv{qu6zeap!51a|1)rBCp5rjFUcr(K3;igd;NjBXiT4Vi$L zNyWTKw+tVx)NRy7{a1+nKcJXv_^w6dsD_DOU=MxG!)v~^tKe)k99)HO_7~YG>>aR!o`9D{C?Hm9A literal 0 HcmV?d00001 From fbd253d1b6dbdd99d1f2763321ef1f81d3e4cab2 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Wed, 20 May 2020 10:31:25 -0400 Subject: [PATCH 002/116] Update ReportingServicesTools.psd1 Added Get-RsRestFolderContent to functions to export. --- ReportingServicesTools/ReportingServicesTools.psd1 | 1 + 1 file changed, 1 insertion(+) diff --git a/ReportingServicesTools/ReportingServicesTools.psd1 b/ReportingServicesTools/ReportingServicesTools.psd1 index e4e4d23f..bb18ebfc 100644 --- a/ReportingServicesTools/ReportingServicesTools.psd1 +++ b/ReportingServicesTools/ReportingServicesTools.psd1 @@ -69,6 +69,7 @@ 'Get-RsCatalogItemRole', 'Get-RsDataSource', 'Get-RsFolderContent', + 'Get-RsRestFolderContent', 'Get-RsItemDataSource', 'Get-RsItemReference', 'Get-RsRestItemDataSource', From 65384c9c3eeb6caf9b1bf4079bc49ff57a634965 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Wed, 20 May 2020 10:50:06 -0400 Subject: [PATCH 003/116] missing end-quote in catch block --- .../Rest/Get-RsRestFolderContent.ps1 | Bin 11186 -> 11188 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestFolderContent.ps1 b/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestFolderContent.ps1 index d02825e9650985e95cfa27ba4b2780edccf8ffd9..152d5751e61bba89f9e8508bf753fd20a341b20d 100644 GIT binary patch delta 30 hcmdlKz9oD^i#DUu Date: Wed, 20 May 2020 16:17:36 -0400 Subject: [PATCH 004/116] Create Get-RsRestItem.ps1 Initial commit of new Get-RsRestItem function. --- .../CatalogItems/Rest/Get-RsRestItem.ps1 | Bin 0 -> 9416 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestItem.ps1 diff --git a/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestItem.ps1 b/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestItem.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..c87fe7faacbbca1d96318b740bea3ffabf081f7e GIT binary patch literal 9416 zcmeHNTTdHD6rSfw{SPZ*2~e>~^N31YAf|CuF2y8ig`$>=0XG;E+dyfQzuxxy&hcSp zytB(1s)k0DW$$Iqo;mm1`maBqxXi7&zPoTYZs5A^#GSek?#;PFH;>~p_f)=_+ra7} zVES%|@3BDf$pN0_?>_Eyadz$+cy7g=;gh+YTbx6=>fq@Pps(q*hnv1s`!9%kzh~G-d8PU>LbNC>r8RI!3@Y!dXwA zdN02ju=Dd3s3IP_wqwJ!-Op~*ZMkinweU?r8T2mb?qa75U&^ivSy8&jLd&6W#npX$ z4@H9ekXj#F$N;Of5t>r(;hxEX^sCf~t&J;{=pac=!##IRK&^rA7U+l((nN^k@)_9rU>j8ljJq>T|iLF`zp4 ze0BvI>$+FKH~=oy&V6`i6!I8MzdPbBw7I6lAbJ}4p|7bVXsI2EbFW1DUD558oL`Rl z+y~~4Tf#Flh<48a{S;@@aJwcL7z4R?SFqoQOGX~X)DRCf5%Q8b+AJX$i5SJtai#Io zJd!rx{nG0?jzH6J_!@g0Nc9wW$& z7DK7|T-Ap@f5Tl`4yn)6UY_X~DVg_)leS3yXK*}*O)`SgU#H868J@E^u9XEVl?=3x z@VS78F5+V_XA-R$V;040EXxiHJ@?<$JS`;UHJPhH6QLKB>F<9ViDOogjSPdzKr#>_#kMdO*8#I@FoGdq;tvzvHOQjKd{T{l=9`f)R ztYPF<#ZHdo_XJ(|yn7SXCKsrzI2q_+EyQBg{vP@^gCIUe9`^FIyd(UwLLEp?whWop z(Af=8A9Qm2czm2Yuu>iZ&+KjY$6Z*t&bkGB{naGB9uF%3_Uo*DW1bAA29NOlY+UnrrD)Z!z^F6>zzDkWAW>7Fff)N8m`bxy;0)E3Lp zZZ6d|4Wad7F4~gybWYG1Ti-tP&dHGWObyibm*9a@7|O}!T$}-=_A9cO6l@vC`I#H1 z0)50BdP-aBZ+0#Xnc?+>I(iPPRjpDerFY^p)B)w>`=lZ&Q}s>gy*gzx`(6dk6Y-P~ zCZ47lY^|Vnq7`fc&$Z+kKc9=~eF2CwsmRy^)DeBGTgXQdb|p2)s(lAkNVBIhw5?Rt zM0&$ME)O$FYf7f1Fm*poQ=EgWLmZALKk7-0No8>)b6t>XEaghmB%NQ5>HNn1 z3f?>JcgR6=%`#@B%4q1MvY&n$2gVK9qJ!`td>Jg4$MvomitL5CkmW;oQ4xC>R=Q%8nF|r(Axdv?48aSf1FTk6= zsZhUb;pz(a-eT4IbK0|yyrjq^c9$#&yMd=!vGk!ui#5ETiWlTEeZO8Honoo!Ox5gb z37C(ef6m4_rFIf~hRMs0jN5l%_*6CUQaIPLmEbsHAvGQ zF!5a)r@C5?g}v1q_bswf88)*>+xdPp8J10Glr>@=i>*|lrH$zRM-q#zRKcRPC1W+G zoU4#*o~k^|^q4hIrg)CA8(ftgHYCn5rguxIPeI)WyHS>x&*TmUS!I_Op#2CReTSko zjkol0wF)-tQS&s~N);?E$sV-UNqV?a1%p=B>h0l7qZo796IFIh&!+Pnq~WUUppnmF zSaBps!%e?Kp7t1X6^t#!yLChxRvA_eY81+AHV;{4haF(%REK$J5~p7)!<4Q8(s#8Q zx`^588kEl6_KjQ7o2R&^Z=%v?oz8z>Xz$Jm2j$rno>^n*+fa7>d^=cJbyv;oX5-wf_4NtLzu@-THU7M=L;&+SZ;cyzt$=H$qy?B%Q)-_ z!rnC9!|6;{r$3yiS&fh~;54{0)m8 BMMeMs literal 0 HcmV?d00001 From ad8b2826d61fa2e90728d0a4357c838f19976418 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Wed, 20 May 2020 16:23:05 -0400 Subject: [PATCH 005/116] Update ReportingServicesTools.psd1 Added Get-RsRestItem and aliases to be exported. --- ReportingServicesTools/ReportingServicesTools.psd1 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ReportingServicesTools/ReportingServicesTools.psd1 b/ReportingServicesTools/ReportingServicesTools.psd1 index e4e4d23f..46858681 100644 --- a/ReportingServicesTools/ReportingServicesTools.psd1 +++ b/ReportingServicesTools/ReportingServicesTools.psd1 @@ -72,6 +72,7 @@ 'Get-RsItemDataSource', 'Get-RsItemReference', 'Get-RsRestItemDataSource', + 'Get-RsRestItem', 'Get-RsSubscription', 'Grant-RsCatalogItemRole', 'Grant-RsSystemRole', @@ -127,7 +128,9 @@ # Aliases are stored in ReportingServicesTools.psm1 AliasesToExport = @( 'Get-RsCatalogItems', + 'Get-RsCatalogItem', 'Get-RsChildItem', + 'Get-RsItem', 'Get-RsItemReferences', 'Grant-AccessOnCatalogItem', 'Grant-AccessToRS', From d435d7aabb1d2197b27b992e0ab7928acbec3175 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Thu, 21 May 2020 11:21:42 -0400 Subject: [PATCH 006/116] Update Get-RsRestItem.ps1 Copied & Pasted into Notepad. --- .../CatalogItems/Rest/Get-RsRestItem.ps1 | Bin 9416 -> 4593 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestItem.ps1 b/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestItem.ps1 index c87fe7faacbbca1d96318b740bea3ffabf081f7e..4d957bba1548aeb31345e75cbfdba64f0c01e5b6 100644 GIT binary patch literal 4593 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 BMMeMs From a7e2529bb25bd4aa824cc7f785d708d61e655435 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Thu, 21 May 2020 11:28:57 -0400 Subject: [PATCH 007/116] Update Get-RsRestFolderContent.ps1 Copied & Pasted into Notepad. --- .../Rest/Get-RsRestFolderContent.ps1 | Bin 11188 -> 5448 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestFolderContent.ps1 b/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestFolderContent.ps1 index 152d5751e61bba89f9e8508bf753fd20a341b20d..f335e3b8b5cd2470ed5dd0291261a1c3aab4873f 100644 GIT binary patch literal 5448 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 From 3346b75caa9c8c754fd867c2bfcac4fba7f35827 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Thu, 21 May 2020 16:40:59 -0400 Subject: [PATCH 008/116] Added test for Get-RsRestFolderContent --- .../Rest/Get-RsRestFolderContent.Tests.ps1 | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 diff --git a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 new file mode 100644 index 00000000..20c2c36d --- /dev/null +++ b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 @@ -0,0 +1,51 @@ +# Copyright (c) 2020 Microsoft Corporation. All Rights Reserved. +# Licensed under the MIT License (MIT) + +$reportPortalUri = if ($env:PesterPortalUrl -eq $null) { 'http://localhost/reports' } else { $env:PesterPortalUrl } +$reportServerUri = if ($env:PesterServerUrl -eq $null) { 'http://localhost/reportserver' } else { $env:PesterServerUrl } + +Describe "Get-RsRestFolderContent" { + Context "Get folder with reportPortalUri parameter"{ + # Create a folder + $folderName = 'SutGetFolderReportPortalUriParameter' + [guid]::NewGuid() + New-RsRestFolder -Path / -FolderName $folderName + $folderPath = '/' + $folderName + # Test if the folder can be found + $folderList = Get-RsRestFolderContent -reportPortalUri $reportPortalUri -RsFolder / + $folderCount = ($folderList | Where-Object name -eq $folderName).Count + It "Should found a folder" { + $folderCount | Should Be 1 + } + # Removing folders used for testing + Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsFolder $folderPath -Confirm:$false + } + + Context "Get folder inside 4 folders"{ + # Create the first folder in the root + $sutRootFolder = 'SutGetFolderParent' + [guid]::NewGuid() + New-RsRestFolder -Path / -FolderName $sutRootFolder + # Create 5 folders, one inside the other + $currentFolderDepth = 2 + $folderParentName = $sutRootFolder + While ($currentFolderDepth -le 5) + { + # Create a folder in a specified path + $folderParentPath += '/' + $folderParentName + $folderParentName = 'SutGetFolderParent' + $currentFolderDepth + New-RsRestFolder -Path $folderParentPath -FolderName $folderParentName + $currentFolderDepth +=1 + + } + # Test if the ´SutGetFolderParent5´ folder inside the other folders can be found + $fifthFolderPath = $folderParentPath + '/' + $folderParentName + $rootFolderPath = '/' + $sutRootFolder + $folderList = Get-RsRestFolderContent -RsFolder $rootFolderPath -Recurse + $folderCount = ($folderList | Where-Object path -eq $fifthFolderPath).Count + It "Should found 4 subfolders" { + $folderCount | Should Be 1 + $folderList.Count | Should be 4 + } + # Removing folders used for testing + Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsFolder $rootFolderPath -Confirm:$false + } +} \ No newline at end of file From 628d67dc97cd78b7224a3ba615f81012d31a0d45 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Thu, 21 May 2020 16:52:49 -0400 Subject: [PATCH 009/116] Added test for Get-RsRestItem --- .../Rest/Get-RsRestItem.Tests.ps1 | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 diff --git a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 new file mode 100644 index 00000000..293b991c --- /dev/null +++ b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 @@ -0,0 +1,51 @@ +# Copyright (c) 2020 Microsoft Corporation. All Rights Reserved. +# Licensed under the MIT License (MIT) + +$reportPortalUri = if ($env:PesterPortalUrl -eq $null) { 'http://localhost/reports' } else { $env:PesterPortalUrl } +$reportServerUri = if ($env:PesterServerUrl -eq $null) { 'http://localhost/reportserver' } else { $env:PesterServerUrl } + +Describe "Get-RsRestItem" { + Context "Get folder with reportPortalUri parameter"{ + # Create a folder + $folderName = 'SutGetFolderReportPortalUriParameter' + [guid]::NewGuid() + New-RsRestFolder -Path / -FolderName $folderName + $folderPath = '/' + $folderName + # Test if the folder can be found + $folderList = Get-RsRestItem -reportPortalUri $reportPortalUri -RsItem / + $folderCount = ($folderList | Where-Object name -eq $folderName).Count + It "Should found a folder" { + $folderCount | Should Be 1 + } + # Removing folders used for testing + Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsFolder $folderPath -Confirm:$false + } + + Context "Get folder inside 4 folders"{ + # Create the first folder in the root + $sutRootFolder = 'SutGetFolderParent' + [guid]::NewGuid() + New-RsRestFolder -Path / -FolderName $sutRootFolder + # Create 5 folders, one inside the other + $currentFolderDepth = 2 + $folderParentName = $sutRootFolder + While ($currentFolderDepth -le 5) + { + # Create a folder in a specified path + $folderParentPath += '/' + $folderParentName + $folderParentName = 'SutGetFolderParent' + $currentFolderDepth + New-RsRestFolder -Path $folderParentPath -FolderName $folderParentName + $currentFolderDepth +=1 + + } + # Test if the ´SutGetFolderParent5´ folder inside the other folders can be found + $fifthFolderPath = $folderParentPath + '/' + $folderParentName + $rootFolderPath = '/' + $sutRootFolder + $folderList = Get-RsRestItem -RsItem $rootFolderPath -Recurse + $folderCount = ($folderList | Where-Object path -eq $fifthFolderPath).Count + It "Should found 4 subfolders" { + $folderCount | Should Be 1 + $folderList.Count | Should be 1 + } + # Removing folders used for testing + Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsFolder $rootFolderPath -Confirm:$false + } +} \ No newline at end of file From 8fff4a87fb66d6d0390f0bff459b029147e6388a Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Fri, 22 May 2020 07:43:04 -0400 Subject: [PATCH 010/116] Corrected -RsFolder param on New-RsRestFolder --- Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 index 293b991c..4f3d2c3f 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 @@ -8,7 +8,7 @@ Describe "Get-RsRestItem" { Context "Get folder with reportPortalUri parameter"{ # Create a folder $folderName = 'SutGetFolderReportPortalUriParameter' + [guid]::NewGuid() - New-RsRestFolder -Path / -FolderName $folderName + New-RsRestFolder -RsFolder / -FolderName $folderName $folderPath = '/' + $folderName # Test if the folder can be found $folderList = Get-RsRestItem -reportPortalUri $reportPortalUri -RsItem / @@ -23,7 +23,7 @@ Describe "Get-RsRestItem" { Context "Get folder inside 4 folders"{ # Create the first folder in the root $sutRootFolder = 'SutGetFolderParent' + [guid]::NewGuid() - New-RsRestFolder -Path / -FolderName $sutRootFolder + New-RsRestFolder -RsFolder / -FolderName $sutRootFolder # Create 5 folders, one inside the other $currentFolderDepth = 2 $folderParentName = $sutRootFolder From c79fbb915095e6a03c802f154cb8f4cf0396398f Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Fri, 22 May 2020 07:52:01 -0400 Subject: [PATCH 011/116] Update Get-RsRestItem.Tests.ps1 Corrected -RsItem param on Remove-RsRestCatalogItem call. --- Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 index 4f3d2c3f..fd9f97ad 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 @@ -17,7 +17,7 @@ Describe "Get-RsRestItem" { $folderCount | Should Be 1 } # Removing folders used for testing - Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsFolder $folderPath -Confirm:$false + Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsItem $folderPath -Confirm:$false } Context "Get folder inside 4 folders"{ @@ -46,6 +46,6 @@ Describe "Get-RsRestItem" { $folderList.Count | Should be 1 } # Removing folders used for testing - Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsFolder $rootFolderPath -Confirm:$false + Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsItem $rootFolderPath -Confirm:$false } } \ No newline at end of file From 4ab0200eee9ac84b601fbf397f9e00ed68caddf0 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Fri, 22 May 2020 08:04:51 -0400 Subject: [PATCH 012/116] Corrected parameter names --- .../Rest/Get-RsRestFolderContent.Tests.ps1 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 index 20c2c36d..6055f046 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 @@ -8,7 +8,7 @@ Describe "Get-RsRestFolderContent" { Context "Get folder with reportPortalUri parameter"{ # Create a folder $folderName = 'SutGetFolderReportPortalUriParameter' + [guid]::NewGuid() - New-RsRestFolder -Path / -FolderName $folderName + New-RsRestFolder -RsFolder / -FolderName $folderName $folderPath = '/' + $folderName # Test if the folder can be found $folderList = Get-RsRestFolderContent -reportPortalUri $reportPortalUri -RsFolder / @@ -17,13 +17,13 @@ Describe "Get-RsRestFolderContent" { $folderCount | Should Be 1 } # Removing folders used for testing - Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsFolder $folderPath -Confirm:$false + Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsItem $folderPath -Confirm:$false } Context "Get folder inside 4 folders"{ # Create the first folder in the root $sutRootFolder = 'SutGetFolderParent' + [guid]::NewGuid() - New-RsRestFolder -Path / -FolderName $sutRootFolder + New-RsRestFolder -RsFolder / -FolderName $sutRootFolder # Create 5 folders, one inside the other $currentFolderDepth = 2 $folderParentName = $sutRootFolder @@ -32,7 +32,7 @@ Describe "Get-RsRestFolderContent" { # Create a folder in a specified path $folderParentPath += '/' + $folderParentName $folderParentName = 'SutGetFolderParent' + $currentFolderDepth - New-RsRestFolder -Path $folderParentPath -FolderName $folderParentName + New-RsRestFolder -RsFolder $folderParentPath -FolderName $folderParentName $currentFolderDepth +=1 } @@ -46,6 +46,6 @@ Describe "Get-RsRestFolderContent" { $folderList.Count | Should be 4 } # Removing folders used for testing - Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsFolder $rootFolderPath -Confirm:$false + Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsItem $rootFolderPath -Confirm:$false } } \ No newline at end of file From 98f5870dd70c38b4fb9f475579a315aef2652834 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Fri, 22 May 2020 10:22:59 -0400 Subject: [PATCH 013/116] Updated Test Corrected path for test. Removed unnecessary line of code from function. --- .../Functions/CatalogItems/Rest/Get-RsRestItem.ps1 | 1 - Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestItem.ps1 b/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestItem.ps1 index 4d957bba..ed72742b 100644 --- a/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestItem.ps1 +++ b/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestItem.ps1 @@ -67,7 +67,6 @@ function Get-RsRestItem $WebSession = New-RsRestSessionHelper -BoundParameters $PSBoundParameters $ReportPortalUri = Get-RsPortalUriHelper -WebSession $WebSession $catalogItemsUri = $ReportPortalUri + "api/$RestApiVersion/CatalogItems(Path='{0}')" - $dataSourcesUri = $ReportPortalUri + "api/$RestApiVersion/{0}(Path='{1}')?`$expand=DataSources" } Process { diff --git a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 index fd9f97ad..4a790504 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 @@ -32,14 +32,14 @@ Describe "Get-RsRestItem" { # Create a folder in a specified path $folderParentPath += '/' + $folderParentName $folderParentName = 'SutGetFolderParent' + $currentFolderDepth - New-RsRestFolder -Path $folderParentPath -FolderName $folderParentName + New-RsRestFolder -RsFolder $folderParentPath -FolderName $folderParentName $currentFolderDepth +=1 } # Test if the ´SutGetFolderParent5´ folder inside the other folders can be found $fifthFolderPath = $folderParentPath + '/' + $folderParentName $rootFolderPath = '/' + $sutRootFolder - $folderList = Get-RsRestItem -RsItem $rootFolderPath -Recurse + $folderList = Get-RsRestItem -RsItem "$folderParentPath/$folderParentName" -Recurse $folderCount = ($folderList | Where-Object path -eq $fifthFolderPath).Count It "Should found 4 subfolders" { $folderCount | Should Be 1 From 54ae4ecfc83026d832c98b895f17da4e4a7c0915 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Fri, 22 May 2020 10:52:31 -0400 Subject: [PATCH 014/116] Update Get-RsRestItem.Tests.ps1 Corrected value being passed in to -RsItem parameter on first Get-RsRestItem call. --- Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 index 4a790504..f44a95d7 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 @@ -11,7 +11,7 @@ Describe "Get-RsRestItem" { New-RsRestFolder -RsFolder / -FolderName $folderName $folderPath = '/' + $folderName # Test if the folder can be found - $folderList = Get-RsRestItem -reportPortalUri $reportPortalUri -RsItem / + $folderList = Get-RsRestItem -reportPortalUri $reportPortalUri -RsItem $folderPath $folderCount = ($folderList | Where-Object name -eq $folderName).Count It "Should found a folder" { $folderCount | Should Be 1 From 03750a7410723edff98ff0249b7db8bf571cb841 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Fri, 22 May 2020 11:25:30 -0400 Subject: [PATCH 015/116] Update Get-RsRestFolderContent.ps1 Removed unnecessary code, improved clarity of variable naming, corrected issue where the RsFolder itself was not included in the results when the -Recure param was included. --- .../Rest/Get-RsRestFolderContent.ps1 | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestFolderContent.ps1 b/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestFolderContent.ps1 index f335e3b8..d82e360f 100644 --- a/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestFolderContent.ps1 +++ b/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestFolderContent.ps1 @@ -69,26 +69,22 @@ function Get-RsRestFolderContent $WebSession = New-RsRestSessionHelper -BoundParameters $PSBoundParameters $ReportPortalUri = Get-RsPortalUriHelper -WebSession $WebSession $catalogItemsUri = $ReportPortalUri + "api/$RestApiVersion/Folders(Path='{0}')/CatalogItems?`$expand=Properties" - $dataSourcesUri = $ReportPortalUri + "api/$RestApiVersion/{0}(Path='{1}')?`$expand=DataSources" } Process { try { Write-Verbose "Fetching metadata for $RsFolder..." - $catalogItemsUri = [String]::Format($catalogItemsUri, $RsFolder) + $url = [String]::Format($catalogItemsUri, $RsFolder) if ($Credential -ne $null) { - $response = Invoke-WebRequest -Uri $catalogItemsUri -Method Get -WebSession $WebSession -Credential $Credential -Verbose:$false + $response = Invoke-WebRequest -Uri $url -Method Get -WebSession $WebSession -Credential $Credential -Verbose:$false } else { - $response = Invoke-WebRequest -Uri $catalogItemsUri -Method Get -WebSession $WebSession -UseDefaultCredentials -Verbose:$false + $response = Invoke-WebRequest -Uri $url -Method Get -WebSession $WebSession -UseDefaultCredentials -Verbose:$false } - $item = ConvertFrom-Json $response.Content - $itemType = $item.Type - $catalogItems = (ConvertFrom-Json $response.Content).value foreach ($catalogItem in $catalogItems) { @@ -97,11 +93,23 @@ function Get-RsRestFolderContent if ($Recurse) { # check for subfolders - $subFolderPath = "$Destination/$($catalogItem.Name)" + $subFolderPath = "$RsFolder/$($catalogItem.Name)" Write-Verbose "Searching folder $($subFolderPath)" # get contents of the subfolders Get-RsRestFolderContent -RsFolder $catalogItem.Path -ReportPortalUri $ReportPortalUri -RestApiVersion $RestApiVersion -Credential $Credential -WebSession $WebSession -Recurse + + [pscustomobject]@{ + Type = $catalogItem.Type + Name = $catalogItem.Name + Size = $catalogItem.Size + ModifiedBy = $catalogItem.ModifiedBy + ModifiedDate = $catalogItem.ModifiedDate + Hidden = $catalogItem.Hidden + Path = $catalogItem.Path + Id = $catalogItem.Id + Description = $catalogItem.Description + } } else { From 78036e59f762010a8a22e24804a38430738de670 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Fri, 22 May 2020 13:11:04 -0400 Subject: [PATCH 016/116] Update Get-RsRestItem.Tests.ps1 Removed -Recurse. --- Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 index f44a95d7..d1bde24a 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 @@ -39,7 +39,7 @@ Describe "Get-RsRestItem" { # Test if the ´SutGetFolderParent5´ folder inside the other folders can be found $fifthFolderPath = $folderParentPath + '/' + $folderParentName $rootFolderPath = '/' + $sutRootFolder - $folderList = Get-RsRestItem -RsItem "$folderParentPath/$folderParentName" -Recurse + $folderList = Get-RsRestItem -RsItem "$folderParentPath/$folderParentName" $folderCount = ($folderList | Where-Object path -eq $fifthFolderPath).Count It "Should found 4 subfolders" { $folderCount | Should Be 1 From 45d32970fd2b35f4224ccff7745ad3e8eea1b1db Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Fri, 22 May 2020 14:10:34 -0400 Subject: [PATCH 017/116] Update Get-RsRestItem.Tests.ps1 Added explicit call for the -reportPortalUri parameter to use the $reportPortalUri variable, so that functions in the script are sure to be calling the same instance of SSRS/PBIRS. --- Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 index d1bde24a..fb6d55c8 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 @@ -8,7 +8,7 @@ Describe "Get-RsRestItem" { Context "Get folder with reportPortalUri parameter"{ # Create a folder $folderName = 'SutGetFolderReportPortalUriParameter' + [guid]::NewGuid() - New-RsRestFolder -RsFolder / -FolderName $folderName + New-RsRestFolder -reportPortalUri $reportPortalUri -RsFolder / -FolderName $folderName $folderPath = '/' + $folderName # Test if the folder can be found $folderList = Get-RsRestItem -reportPortalUri $reportPortalUri -RsItem $folderPath @@ -23,7 +23,7 @@ Describe "Get-RsRestItem" { Context "Get folder inside 4 folders"{ # Create the first folder in the root $sutRootFolder = 'SutGetFolderParent' + [guid]::NewGuid() - New-RsRestFolder -RsFolder / -FolderName $sutRootFolder + New-RsRestFolder -reportPortalUri $reportPortalUri -RsFolder / -FolderName $sutRootFolder # Create 5 folders, one inside the other $currentFolderDepth = 2 $folderParentName = $sutRootFolder @@ -32,14 +32,14 @@ Describe "Get-RsRestItem" { # Create a folder in a specified path $folderParentPath += '/' + $folderParentName $folderParentName = 'SutGetFolderParent' + $currentFolderDepth - New-RsRestFolder -RsFolder $folderParentPath -FolderName $folderParentName + New-RsRestFolder -reportPortalUri $reportPortalUri -RsFolder $folderParentPath -FolderName $folderParentName $currentFolderDepth +=1 } # Test if the ´SutGetFolderParent5´ folder inside the other folders can be found $fifthFolderPath = $folderParentPath + '/' + $folderParentName $rootFolderPath = '/' + $sutRootFolder - $folderList = Get-RsRestItem -RsItem "$folderParentPath/$folderParentName" + $folderList = Get-RsRestItem -reportPortalUri $reportPortalUri -RsItem "$folderParentPath/$folderParentName" $folderCount = ($folderList | Where-Object path -eq $fifthFolderPath).Count It "Should found 4 subfolders" { $folderCount | Should Be 1 From 91835de209df7f4d4dcf3e306ecff32958e70161 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Fri, 22 May 2020 14:19:22 -0400 Subject: [PATCH 018/116] Update Get-RsRestFolderContent.Tests.ps1 Added explicit call for the -reportPortalUri parameter to use the $reportPortalUri variable, so that functions in the script are sure to be calling the same instance of SSRS/PBIRS. --- Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 index 6055f046..41a63ef1 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 @@ -8,7 +8,7 @@ Describe "Get-RsRestFolderContent" { Context "Get folder with reportPortalUri parameter"{ # Create a folder $folderName = 'SutGetFolderReportPortalUriParameter' + [guid]::NewGuid() - New-RsRestFolder -RsFolder / -FolderName $folderName + New-RsRestFolder-reportPortalUri $reportPortalUri -RsFolder / -FolderName $folderName $folderPath = '/' + $folderName # Test if the folder can be found $folderList = Get-RsRestFolderContent -reportPortalUri $reportPortalUri -RsFolder / @@ -23,7 +23,7 @@ Describe "Get-RsRestFolderContent" { Context "Get folder inside 4 folders"{ # Create the first folder in the root $sutRootFolder = 'SutGetFolderParent' + [guid]::NewGuid() - New-RsRestFolder -RsFolder / -FolderName $sutRootFolder + New-RsRestFolder-reportPortalUri $reportPortalUri -RsFolder / -FolderName $sutRootFolder # Create 5 folders, one inside the other $currentFolderDepth = 2 $folderParentName = $sutRootFolder @@ -32,14 +32,14 @@ Describe "Get-RsRestFolderContent" { # Create a folder in a specified path $folderParentPath += '/' + $folderParentName $folderParentName = 'SutGetFolderParent' + $currentFolderDepth - New-RsRestFolder -RsFolder $folderParentPath -FolderName $folderParentName + New-RsRestFolder-reportPortalUri $reportPortalUri -RsFolder $folderParentPath -FolderName $folderParentName $currentFolderDepth +=1 } # Test if the ´SutGetFolderParent5´ folder inside the other folders can be found $fifthFolderPath = $folderParentPath + '/' + $folderParentName $rootFolderPath = '/' + $sutRootFolder - $folderList = Get-RsRestFolderContent -RsFolder $rootFolderPath -Recurse + $folderList = Get-RsRestFolderContent-reportPortalUri $reportPortalUri -RsFolder $rootFolderPath -Recurse $folderCount = ($folderList | Where-Object path -eq $fifthFolderPath).Count It "Should found 4 subfolders" { $folderCount | Should Be 1 From acd22806615c4c2ef54e4dca4872bbdbb178c41c Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Fri, 22 May 2020 14:53:50 -0400 Subject: [PATCH 019/116] Update Get-RsRestItem.Tests.ps1 Attempting to add output of variables withing tests. --- Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 index fb6d55c8..579f900b 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 @@ -19,6 +19,8 @@ Describe "Get-RsRestItem" { # Removing folders used for testing Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsItem $folderPath -Confirm:$false } +"$($folderName)"; +"$($folderList.Name)"; Context "Get folder inside 4 folders"{ # Create the first folder in the root @@ -48,4 +50,7 @@ Describe "Get-RsRestItem" { # Removing folders used for testing Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsItem $rootFolderPath -Confirm:$false } +"$($folderName)"; +"$($folderList.Name)"; + } \ No newline at end of file From d43ec4d7400ab096a6ca96a16b6377c7131d4d03 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Fri, 22 May 2020 15:32:58 -0400 Subject: [PATCH 020/116] Update Get-RsRestFolderContent.Tests.ps1 missing space between function and parameter. --- Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 index 41a63ef1..9ebba5e0 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 @@ -8,7 +8,7 @@ Describe "Get-RsRestFolderContent" { Context "Get folder with reportPortalUri parameter"{ # Create a folder $folderName = 'SutGetFolderReportPortalUriParameter' + [guid]::NewGuid() - New-RsRestFolder-reportPortalUri $reportPortalUri -RsFolder / -FolderName $folderName + New-RsRestFolder -reportPortalUri $reportPortalUri -RsFolder / -FolderName $folderName $folderPath = '/' + $folderName # Test if the folder can be found $folderList = Get-RsRestFolderContent -reportPortalUri $reportPortalUri -RsFolder / @@ -23,7 +23,7 @@ Describe "Get-RsRestFolderContent" { Context "Get folder inside 4 folders"{ # Create the first folder in the root $sutRootFolder = 'SutGetFolderParent' + [guid]::NewGuid() - New-RsRestFolder-reportPortalUri $reportPortalUri -RsFolder / -FolderName $sutRootFolder + New-RsRestFolder -reportPortalUri $reportPortalUri -RsFolder / -FolderName $sutRootFolder # Create 5 folders, one inside the other $currentFolderDepth = 2 $folderParentName = $sutRootFolder @@ -32,7 +32,7 @@ Describe "Get-RsRestFolderContent" { # Create a folder in a specified path $folderParentPath += '/' + $folderParentName $folderParentName = 'SutGetFolderParent' + $currentFolderDepth - New-RsRestFolder-reportPortalUri $reportPortalUri -RsFolder $folderParentPath -FolderName $folderParentName + New-RsRestFolder -reportPortalUri $reportPortalUri -RsFolder $folderParentPath -FolderName $folderParentName $currentFolderDepth +=1 } From eb72b507a88750104fd29ccdcdefe0ef8284ad2d Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Fri, 22 May 2020 16:35:35 -0400 Subject: [PATCH 021/116] Update Get-RsFolderContentTests.ps1 --- Tests/CatalogItems/Get-RsFolderContentTests.ps1 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Tests/CatalogItems/Get-RsFolderContentTests.ps1 b/Tests/CatalogItems/Get-RsFolderContentTests.ps1 index 2d4d8dda..384d673c 100644 --- a/Tests/CatalogItems/Get-RsFolderContentTests.ps1 +++ b/Tests/CatalogItems/Get-RsFolderContentTests.ps1 @@ -18,6 +18,8 @@ Describe "Get-RsFolderContent" { # Removing folders used for testing Remove-RsCatalogItem -ReportServerUri 'http://localhost/reportserver' -RsFolder $folderPath -Confirm:$false } +"$($folderName)"; +"$($folderList.Name)"; Context "Get folder with proxy parameter"{ # Create a folder @@ -82,4 +84,7 @@ Describe "Get-RsFolderContent" { # Removing folders used for testing Remove-RsCatalogItem -ReportServerUri 'http://localhost/reportserver' -RsFolder $rootFolderPath -Confirm:$false } +"$($folderName)"; +"$($folderList.Name)"; + } \ No newline at end of file From 9c8c45db297e937ce189589a13e51f564691daab Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Wed, 27 May 2020 08:47:23 -0400 Subject: [PATCH 022/116] Update Get-RsRestItem.Tests.ps1 Changed to pipe to measure-object cmdlet instead of using .count() property. --- Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 index 579f900b..9ec8d8e1 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 @@ -12,7 +12,7 @@ Describe "Get-RsRestItem" { $folderPath = '/' + $folderName # Test if the folder can be found $folderList = Get-RsRestItem -reportPortalUri $reportPortalUri -RsItem $folderPath - $folderCount = ($folderList | Where-Object name -eq $folderName).Count + $folderCount = $folderList | Where-Object name -eq $folderName | measure It "Should found a folder" { $folderCount | Should Be 1 } @@ -42,8 +42,8 @@ Describe "Get-RsRestItem" { $fifthFolderPath = $folderParentPath + '/' + $folderParentName $rootFolderPath = '/' + $sutRootFolder $folderList = Get-RsRestItem -reportPortalUri $reportPortalUri -RsItem "$folderParentPath/$folderParentName" - $folderCount = ($folderList | Where-Object path -eq $fifthFolderPath).Count - It "Should found 4 subfolders" { + $folderCount = $folderList | Where-Object path -eq $fifthFolderPath | measure + It "Should find 1 subfolder underneath 4 subfolders" { $folderCount | Should Be 1 $folderList.Count | Should be 1 } From 53186f4cebb259fb11c3bf45bd8e5c1f1a5598c0 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Wed, 27 May 2020 09:03:43 -0400 Subject: [PATCH 023/116] Update Get-RsRestFolderContent.Tests.ps1 Changed to pipe to measure cmdlet instead of .count() property. --- Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 index 9ebba5e0..c6d99078 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 @@ -12,9 +12,9 @@ Describe "Get-RsRestFolderContent" { $folderPath = '/' + $folderName # Test if the folder can be found $folderList = Get-RsRestFolderContent -reportPortalUri $reportPortalUri -RsFolder / - $folderCount = ($folderList | Where-Object name -eq $folderName).Count + $folderCount = $folderList | Where-Object name -eq $folderName | measure It "Should found a folder" { - $folderCount | Should Be 1 + $folderCount.Count | Should Be 1 } # Removing folders used for testing Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsItem $folderPath -Confirm:$false @@ -40,7 +40,7 @@ Describe "Get-RsRestFolderContent" { $fifthFolderPath = $folderParentPath + '/' + $folderParentName $rootFolderPath = '/' + $sutRootFolder $folderList = Get-RsRestFolderContent-reportPortalUri $reportPortalUri -RsFolder $rootFolderPath -Recurse - $folderCount = ($folderList | Where-Object path -eq $fifthFolderPath).Count + $folderCount = $folderList | Where-Object path -eq $fifthFolderPath | measure It "Should found 4 subfolders" { $folderCount | Should Be 1 $folderList.Count | Should be 4 From 2ee98969f2e6e86bfc852d56a40332f9de01958d Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Wed, 27 May 2020 10:24:40 -0400 Subject: [PATCH 024/116] Update Get-RsRestFolderContent.Tests.ps1 Added output of variables from test. --- .../Rest/Get-RsRestFolderContent.Tests.ps1 | 43 ++++++++++++++++--- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 index c6d99078..f75dd1fb 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 @@ -12,14 +12,30 @@ Describe "Get-RsRestFolderContent" { $folderPath = '/' + $folderName # Test if the folder can be found $folderList = Get-RsRestFolderContent -reportPortalUri $reportPortalUri -RsFolder / - $folderCount = $folderList | Where-Object name -eq $folderName | measure + $folderCount = ($folderList | Where-Object name -eq $folderName).Count It "Should found a folder" { - $folderCount.Count | Should Be 1 + $folderCount | Should Be 1 } # Removing folders used for testing Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsItem $folderPath -Confirm:$false } - +Write-Host '---------------------------- +' +Write-Host 'Showing $folderName variable for single folder test +' +Write-Host $folderName +Write-Host '---------------------------- +' +Write-Host 'Showing $folderList variable for single folder test +' +Write-Host $folderList +Write-Host '---------------------------- +' +Write-Host 'Showing $folderCount variable for single folder test +' +Write-Host $folderCount +Write-Host '---------------------------- +' Context "Get folder inside 4 folders"{ # Create the first folder in the root $sutRootFolder = 'SutGetFolderParent' + [guid]::NewGuid() @@ -40,7 +56,7 @@ Describe "Get-RsRestFolderContent" { $fifthFolderPath = $folderParentPath + '/' + $folderParentName $rootFolderPath = '/' + $sutRootFolder $folderList = Get-RsRestFolderContent-reportPortalUri $reportPortalUri -RsFolder $rootFolderPath -Recurse - $folderCount = $folderList | Where-Object path -eq $fifthFolderPath | measure + $folderCount = ($folderList | Where-Object path -eq $fifthFolderPath).Count It "Should found 4 subfolders" { $folderCount | Should Be 1 $folderList.Count | Should be 4 @@ -48,4 +64,21 @@ Describe "Get-RsRestFolderContent" { # Removing folders used for testing Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsItem $rootFolderPath -Confirm:$false } -} \ No newline at end of file +} +Write-Host '---------------------------- +' +Write-Host 'Showing $folderName variable for 4 folders test +' +Write-Host $folderName +Write-Host '---------------------------- +' +Write-Host 'Showing $folderList variable for 4 folders test +' +Write-Host $folderList +Write-Host '---------------------------- +' +Write-Host 'Showing $folderCount variable for 4 folders test +' +Write-Host $folderCount +Write-Host '---------------------------- +' \ No newline at end of file From 63d6c8207cc229d2362e5372ada4ca72a5da86bc Mon Sep 17 00:00:00 2001 From: Jaime Tarquino Date: Thu, 28 May 2020 07:09:25 -0700 Subject: [PATCH 025/116] additional logging --- appveyor.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index 1297b075..fab5eb38 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -22,6 +22,8 @@ build: false before_test: - cmd: NET USER rsuser1 "%SqlSaPwd%" /ADD /Y - ps: | + write-host "Showing Version of Pester" + gci "C:\Program Files\WindowsPowerShell\Modules\Pester" $ErrorActionPreference = 'Stop'; [Environment]::SetEnvironmentVariable("RsUser", "$($env:ComputerName)\rsuser1") $url = "$($env:downloadUrl)/SQLServer2017-x64-ENU.exe" @@ -75,7 +77,9 @@ before_test: test_script: - ps: | # Execute the script analyzer + Write-Host "Starting execution of script analyzer" $results = Invoke-ScriptAnalyzer -Path .\ReportingServicesTools\functions -Recurse | where severity -eq "Error" + Write-Host "Completed execution of script analyzer" # Format the results $header = "" $body = $results | ForEach-Object {"$($_.Message)"} @@ -105,10 +109,12 @@ test_script: # Integration test section + Write-Host "Starting execution of Pester Tests" # Activate verbose on Powershell $VerbosePreference = "continue" # Executing integration tests $resultsIT = Invoke-Pester -Path ".\Tests" -OutputFormat NUnitXml -OutputFile TestsResultsIT.xml -PassThru + Write-Host "Completed execution of Pester Tests" # Upload integration tests results $wcIT = New-Object 'System.Net.WebClient' $wcIT.UploadFile("https://ci.appveyor.com/api/testresults/nunit/$($env:APPVEYOR_JOB_ID)", (Resolve-Path .\TestsResultsIT.xml)) From 5f697bda399dec5bc78a092e2a78291c73f7e262 Mon Sep 17 00:00:00 2001 From: Jaime Tarquino Date: Thu, 28 May 2020 07:12:30 -0700 Subject: [PATCH 026/116] set pester version static --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index fab5eb38..9d7929e1 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -15,7 +15,7 @@ skip_commits: install: - ps: Install-PackageProvider -Name NuGet -Force - ps: Install-Module -Name PSScriptAnalyzer -Force -- ps: Install-Module -Name Pester +- ps: Install-Module -Name Pester -RequiredVersion 4.10.1 build: false From 74a7b980808e4f132744afe3ec0999597a482d4c Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Thu, 28 May 2020 12:55:15 -0400 Subject: [PATCH 027/116] Update Get-RsRestFolderContent.Tests.ps1 Missing space between function and parameter. --- Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 index f75dd1fb..c0c7ec21 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 @@ -55,7 +55,7 @@ Write-Host '---------------------------- # Test if the ´SutGetFolderParent5´ folder inside the other folders can be found $fifthFolderPath = $folderParentPath + '/' + $folderParentName $rootFolderPath = '/' + $sutRootFolder - $folderList = Get-RsRestFolderContent-reportPortalUri $reportPortalUri -RsFolder $rootFolderPath -Recurse + $folderList = Get-RsRestFolderContent -reportPortalUri $reportPortalUri -RsFolder $rootFolderPath -Recurse $folderCount = ($folderList | Where-Object path -eq $fifthFolderPath).Count It "Should found 4 subfolders" { $folderCount | Should Be 1 From 3c9d6e3bda2c0f5097b42c91294813af7d2368c1 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Thu, 28 May 2020 14:07:56 -0400 Subject: [PATCH 028/116] Update Get-RsRestItem.Tests.ps1 Adding Write-Host messages. --- .../Rest/Get-RsRestItem.Tests.ps1 | 42 ++++++++++++++++--- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 index 9ec8d8e1..2eadf29b 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 @@ -14,13 +14,28 @@ Describe "Get-RsRestItem" { $folderList = Get-RsRestItem -reportPortalUri $reportPortalUri -RsItem $folderPath $folderCount = $folderList | Where-Object name -eq $folderName | measure It "Should found a folder" { - $folderCount | Should Be 1 + $folderCount.Count | Should Be 1 } # Removing folders used for testing Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsItem $folderPath -Confirm:$false } -"$($folderName)"; -"$($folderList.Name)"; +Write-Host '---------------------------- +' +Write-Host 'Showing $folderName variable for 4 folders test +' +Write-Host $folderName +Write-Host '---------------------------- +' +Write-Host 'Showing $folderList variable for 4 folders test +' +Write-Host $folderList +Write-Host '---------------------------- +' +Write-Host 'Showing $folderCount variable for 4 folders test +' +Write-Host $folderCount +Write-Host '---------------------------- +' Context "Get folder inside 4 folders"{ # Create the first folder in the root @@ -44,13 +59,28 @@ Describe "Get-RsRestItem" { $folderList = Get-RsRestItem -reportPortalUri $reportPortalUri -RsItem "$folderParentPath/$folderParentName" $folderCount = $folderList | Where-Object path -eq $fifthFolderPath | measure It "Should find 1 subfolder underneath 4 subfolders" { - $folderCount | Should Be 1 + $folderCount.Count | Should Be 1 $folderList.Count | Should be 1 } # Removing folders used for testing Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsItem $rootFolderPath -Confirm:$false } -"$($folderName)"; -"$($folderList.Name)"; +Write-Host '---------------------------- +' +Write-Host 'Showing $folderName variable for 4 folders test +' +Write-Host $folderName +Write-Host '---------------------------- +' +Write-Host 'Showing $folderList variable for 4 folders test +' +Write-Host $folderList +Write-Host '---------------------------- +' +Write-Host 'Showing $folderCount variable for 4 folders test +' +Write-Host $folderCount +Write-Host '---------------------------- +' } \ No newline at end of file From 04338bc631c5502215fea4d8ab0ba94e07e138d3 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Thu, 28 May 2020 14:29:49 -0400 Subject: [PATCH 029/116] Update Get-RsRestFolderContent.Tests.ps1 Switched to Double-Quotes --- .../Rest/Get-RsRestFolderContent.Tests.ps1 | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 index c0c7ec21..134b4e3a 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 @@ -19,23 +19,23 @@ Describe "Get-RsRestFolderContent" { # Removing folders used for testing Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsItem $folderPath -Confirm:$false } -Write-Host '---------------------------- -' -Write-Host 'Showing $folderName variable for single folder test -' +Write-Host "---------------------------- +" +Write-Host "Showing $folderName variable for single folder test +" Write-Host $folderName -Write-Host '---------------------------- -' -Write-Host 'Showing $folderList variable for single folder test -' +Write-Host "---------------------------- +" +Write-Host "Showing $folderList variable for single folder test +" Write-Host $folderList -Write-Host '---------------------------- -' -Write-Host 'Showing $folderCount variable for single folder test -' +Write-Host "---------------------------- +" +Write-Host "Showing $folderCount variable for single folder test +" Write-Host $folderCount -Write-Host '---------------------------- -' +Write-Host "---------------------------- +" Context "Get folder inside 4 folders"{ # Create the first folder in the root $sutRootFolder = 'SutGetFolderParent' + [guid]::NewGuid() @@ -65,20 +65,20 @@ Write-Host '---------------------------- Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsItem $rootFolderPath -Confirm:$false } } -Write-Host '---------------------------- -' -Write-Host 'Showing $folderName variable for 4 folders test -' +Write-Host "---------------------------- +" +Write-Host "Showing $folderName variable for 4 folders test +" Write-Host $folderName -Write-Host '---------------------------- -' -Write-Host 'Showing $folderList variable for 4 folders test -' +Write-Host "---------------------------- +" +Write-Host "Showing $folderList variable for 4 folders test +" Write-Host $folderList -Write-Host '---------------------------- -' -Write-Host 'Showing $folderCount variable for 4 folders test -' +Write-Host "---------------------------- +" +Write-Host "Showing $folderCount variable for 4 folders test +" Write-Host $folderCount -Write-Host '---------------------------- -' \ No newline at end of file +Write-Host "---------------------------- +" \ No newline at end of file From 2662026be835c125c1b4798be48b6028f12a2327 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Thu, 28 May 2020 14:33:07 -0400 Subject: [PATCH 030/116] Update Get-RsRestItem.Tests.ps1 Added quotes around variable name. --- Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 index 2eadf29b..97c4856e 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 @@ -23,17 +23,17 @@ Write-Host '---------------------------- ' Write-Host 'Showing $folderName variable for 4 folders test ' -Write-Host $folderName +Write-Host "$($folderName)" Write-Host '---------------------------- ' Write-Host 'Showing $folderList variable for 4 folders test ' -Write-Host $folderList +Write-Host "$($folderList)" Write-Host '---------------------------- ' Write-Host 'Showing $folderCount variable for 4 folders test ' -Write-Host $folderCount +Write-Host "$($folderCount)" Write-Host '---------------------------- ' @@ -69,17 +69,17 @@ Write-Host '---------------------------- ' Write-Host 'Showing $folderName variable for 4 folders test ' -Write-Host $folderName +Write-Host "$($folderName)" Write-Host '---------------------------- ' Write-Host 'Showing $folderList variable for 4 folders test ' -Write-Host $folderList +Write-Host "$($folderList)" Write-Host '---------------------------- ' Write-Host 'Showing $folderCount variable for 4 folders test ' -Write-Host $folderCount +Write-Host "$($folderCount)" Write-Host '---------------------------- ' From 763b175c20284a171cd5b3927d9ceb742edf17d5 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Thu, 28 May 2020 14:35:02 -0400 Subject: [PATCH 031/116] Update Get-RsRestFolderContent.Tests.ps1 Added quotes around variable name in Write-Host. --- .../Rest/Get-RsRestFolderContent.Tests.ps1 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 index 134b4e3a..f6985f41 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 @@ -23,17 +23,17 @@ Write-Host "---------------------------- " Write-Host "Showing $folderName variable for single folder test " -Write-Host $folderName +Write-Host "$folderName" Write-Host "---------------------------- " Write-Host "Showing $folderList variable for single folder test " -Write-Host $folderList +Write-Host "$folderList" Write-Host "---------------------------- " Write-Host "Showing $folderCount variable for single folder test " -Write-Host $folderCount +Write-Host "$folderCount" Write-Host "---------------------------- " Context "Get folder inside 4 folders"{ @@ -69,16 +69,16 @@ Write-Host "---------------------------- " Write-Host "Showing $folderName variable for 4 folders test " -Write-Host $folderName +Write-Host "$folderName" Write-Host "---------------------------- " Write-Host "Showing $folderList variable for 4 folders test " -Write-Host $folderList +Write-Host "$folderList" Write-Host "---------------------------- " Write-Host "Showing $folderCount variable for 4 folders test " -Write-Host $folderCount +Write-Host "$folderCount" Write-Host "---------------------------- " \ No newline at end of file From eb771971c935f8d45b45029c84c571a504305f39 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Thu, 28 May 2020 16:19:30 -0400 Subject: [PATCH 032/116] Update Get-RsRestItem.Tests.ps1 Swapped Count for Measure. --- Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 index 97c4856e..ec181f06 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 @@ -60,7 +60,7 @@ Write-Host '---------------------------- $folderCount = $folderList | Where-Object path -eq $fifthFolderPath | measure It "Should find 1 subfolder underneath 4 subfolders" { $folderCount.Count | Should Be 1 - $folderList.Count | Should be 1 + ($folderList.Count | measure).count | Should be 1 } # Removing folders used for testing Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsItem $rootFolderPath -Confirm:$false From e2131b02c79e14b01ff54fe0d8bfa23670791811 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Thu, 28 May 2020 16:47:52 -0400 Subject: [PATCH 033/116] Update Get-RsRestFolderContent.Tests.ps1 Switched from .count to measure then .count --- Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 index f6985f41..ae1faafd 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 @@ -12,7 +12,7 @@ Describe "Get-RsRestFolderContent" { $folderPath = '/' + $folderName # Test if the folder can be found $folderList = Get-RsRestFolderContent -reportPortalUri $reportPortalUri -RsFolder / - $folderCount = ($folderList | Where-Object name -eq $folderName).Count + $folderCount = ($folderList | Where-Object name -eq $folderName | measure).Count It "Should found a folder" { $folderCount | Should Be 1 } @@ -64,7 +64,6 @@ Write-Host "---------------------------- # Removing folders used for testing Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsItem $rootFolderPath -Confirm:$false } -} Write-Host "---------------------------- " Write-Host "Showing $folderName variable for 4 folders test @@ -81,4 +80,5 @@ Write-Host "Showing $folderCount variable for 4 folders test " Write-Host "$folderCount" Write-Host "---------------------------- -" \ No newline at end of file +" +} \ No newline at end of file From e2f0bf7e87a68b493108719e0d32037ce046de42 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Thu, 28 May 2020 17:14:45 -0400 Subject: [PATCH 034/116] Update Get-RsRestFolderContent.Tests.ps1 Moved the Write-Host statements inside the brackets. --- .../Rest/Get-RsRestFolderContent.Tests.ps1 | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 index ae1faafd..93d9ae95 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 @@ -16,26 +16,26 @@ Describe "Get-RsRestFolderContent" { It "Should found a folder" { $folderCount | Should Be 1 } + Write-Host "---------------------------- + " + Write-Host "Showing $folderName variable for single folder test + " + Write-Host "$folderName" + Write-Host "---------------------------- + " + Write-Host "Showing $folderList variable for single folder test + " + Write-Host "$folderList" + Write-Host "---------------------------- + " + Write-Host "Showing $folderCount variable for single folder test + " + Write-Host "$folderCount" + Write-Host "---------------------------- + " # Removing folders used for testing Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsItem $folderPath -Confirm:$false } -Write-Host "---------------------------- -" -Write-Host "Showing $folderName variable for single folder test -" -Write-Host "$folderName" -Write-Host "---------------------------- -" -Write-Host "Showing $folderList variable for single folder test -" -Write-Host "$folderList" -Write-Host "---------------------------- -" -Write-Host "Showing $folderCount variable for single folder test -" -Write-Host "$folderCount" -Write-Host "---------------------------- -" Context "Get folder inside 4 folders"{ # Create the first folder in the root $sutRootFolder = 'SutGetFolderParent' + [guid]::NewGuid() @@ -61,24 +61,24 @@ Write-Host "---------------------------- $folderCount | Should Be 1 $folderList.Count | Should be 4 } + Write-Host "---------------------------- + " + Write-Host "Showing $folderName variable for 4 folders test + " + Write-Host "$folderName" + Write-Host "---------------------------- + " + Write-Host "Showing $folderList variable for 4 folders test + " + Write-Host "$folderList" + Write-Host "---------------------------- + " + Write-Host "Showing $folderCount variable for 4 folders test + " + Write-Host "$folderCount" + Write-Host "---------------------------- + " # Removing folders used for testing Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsItem $rootFolderPath -Confirm:$false } -Write-Host "---------------------------- -" -Write-Host "Showing $folderName variable for 4 folders test -" -Write-Host "$folderName" -Write-Host "---------------------------- -" -Write-Host "Showing $folderList variable for 4 folders test -" -Write-Host "$folderList" -Write-Host "---------------------------- -" -Write-Host "Showing $folderCount variable for 4 folders test -" -Write-Host "$folderCount" -Write-Host "---------------------------- -" } \ No newline at end of file From 8d4152b4e7c98206900ae3707c925a70ad8667c9 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Thu, 28 May 2020 17:21:23 -0400 Subject: [PATCH 035/116] Update Get-RsRestItem.Tests.ps1 too many .count's --- Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 index ec181f06..b5a3f785 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 @@ -60,7 +60,7 @@ Write-Host '---------------------------- $folderCount = $folderList | Where-Object path -eq $fifthFolderPath | measure It "Should find 1 subfolder underneath 4 subfolders" { $folderCount.Count | Should Be 1 - ($folderList.Count | measure).count | Should be 1 + ($folderList | measure).count | Should be 1 } # Removing folders used for testing Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsItem $rootFolderPath -Confirm:$false From 99e1e47d04b9441e9e45d77dd53015fa97bd136a Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Thu, 28 May 2020 19:55:36 -0400 Subject: [PATCH 036/116] Update Get-RsRestFolderContent.Tests.ps1 Added another pipe to measure. --- Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 index 93d9ae95..4cd222b1 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 @@ -56,7 +56,7 @@ Describe "Get-RsRestFolderContent" { $fifthFolderPath = $folderParentPath + '/' + $folderParentName $rootFolderPath = '/' + $sutRootFolder $folderList = Get-RsRestFolderContent -reportPortalUri $reportPortalUri -RsFolder $rootFolderPath -Recurse - $folderCount = ($folderList | Where-Object path -eq $fifthFolderPath).Count + $folderCount = ($folderList | Where-Object path -eq $fifthFolderPath | measure).Count It "Should found 4 subfolders" { $folderCount | Should Be 1 $folderList.Count | Should be 4 From c07c6b4d1de993a5aab82e5c222d38198b34abc7 Mon Sep 17 00:00:00 2001 From: Jaime Tarquino Date: Sat, 30 May 2020 19:04:02 +0000 Subject: [PATCH 037/116] Automatic Version Update from CI --- ReportingServicesTools/ReportingServicesTools.psd1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReportingServicesTools/ReportingServicesTools.psd1 b/ReportingServicesTools/ReportingServicesTools.psd1 index 4e589064..0f31c14e 100644 --- a/ReportingServicesTools/ReportingServicesTools.psd1 +++ b/ReportingServicesTools/ReportingServicesTools.psd1 @@ -7,7 +7,7 @@ RootModule = 'ReportingServicesTools.psm1' # Version number of this module. - ModuleVersion = '0.0.5.5' + ModuleVersion = '0.0.5.6' # ID used to uniquely identify this module GUID = '9d139310-ce45-41ce-8e8b-d76335aa1789' From 1ad3b32abd3ee98f240962fc0c9e64648227d496 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Thu, 18 Jun 2020 10:23:35 -0400 Subject: [PATCH 038/116] Fixing tests --- .../Rest/Get-RsRestFolderContent.Tests.ps1 | 3 +- .../Rest/Get-RsRestItem.Tests.ps1 | 34 +++++++++---------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 index 4cd222b1..f5c6f64d 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestFolderContent.Tests.ps1 @@ -60,7 +60,7 @@ Describe "Get-RsRestFolderContent" { It "Should found 4 subfolders" { $folderCount | Should Be 1 $folderList.Count | Should be 4 - } + Write-Host "---------------------------- " Write-Host "Showing $folderName variable for 4 folders test @@ -78,6 +78,7 @@ Describe "Get-RsRestFolderContent" { Write-Host "$folderCount" Write-Host "---------------------------- " + } # Removing folders used for testing Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsItem $rootFolderPath -Confirm:$false } diff --git a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 index b5a3f785..da0bfe7d 100644 --- a/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Get-RsRestItem.Tests.ps1 @@ -64,23 +64,23 @@ Write-Host '---------------------------- } # Removing folders used for testing Remove-RsRestCatalogItem -ReportPortalUri $reportPortalUri -RsItem $rootFolderPath -Confirm:$false + Write-Host '---------------------------- + ' + Write-Host 'Showing $folderName variable for 4 folders test + ' + Write-Host "$($folderName)" + Write-Host '---------------------------- + ' + Write-Host 'Showing $folderList variable for 4 folders test + ' + Write-Host "$($folderList)" + Write-Host '---------------------------- + ' + Write-Host 'Showing $folderCount variable for 4 folders test + ' + Write-Host "$($folderCount)" + Write-Host '---------------------------- + ' } -Write-Host '---------------------------- -' -Write-Host 'Showing $folderName variable for 4 folders test -' -Write-Host "$($folderName)" -Write-Host '---------------------------- -' -Write-Host 'Showing $folderList variable for 4 folders test -' -Write-Host "$($folderList)" -Write-Host '---------------------------- -' -Write-Host 'Showing $folderCount variable for 4 folders test -' -Write-Host "$($folderCount)" -Write-Host '---------------------------- -' } \ No newline at end of file From 4d6c271c729e68cfcfcb190ad17a24603e620c2b Mon Sep 17 00:00:00 2001 From: Guilherme Boreki Date: Mon, 5 Oct 2020 12:07:44 -0700 Subject: [PATCH 039/116] add rest parameters --- .../Get-RsRestItemDataModelParameters.ps1 | 117 ++++++++++++++++++ .../Set-RsRestItemDataModelParameters.ps1 | 108 ++++++++++++++++ .../ReportingServicesTools.psd1 | 2 + 3 files changed, 227 insertions(+) create mode 100644 ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestItemDataModelParameters.ps1 create mode 100644 ReportingServicesTools/Functions/CatalogItems/Rest/Set-RsRestItemDataModelParameters.ps1 diff --git a/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestItemDataModelParameters.ps1 b/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestItemDataModelParameters.ps1 new file mode 100644 index 00000000..bd32da1f --- /dev/null +++ b/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestItemDataModelParameters.ps1 @@ -0,0 +1,117 @@ +# Copyright (c) 2017 Microsoft Corporation. All Rights Reserved. +# Licensed under the MIT License (MIT) + +function Get-RsRestItemDataModelParameters +{ + <# + .SYNOPSIS + This script fetches the Data Model Parameters related to a Catalog Item report from the Report Server + + .DESCRIPTION + TThis script fetches the Data Model Parameters related to a Catalog Item report from the Report Server + + .PARAMETER RsItem + Specify the location of the catalog item whose data model parameters should be fetched. + + .PARAMETER ReportPortalUri + Specify the Report Portal URL to your Power Bi Report Server Instance. + + .PARAMETER RestApiVersion + Specify the version of REST Endpoint to use. Valid values are: "v2.0". + + .PARAMETER Credential + Specify the credentials to use when connecting to the Report Server. + + .PARAMETER WebSession + Specify the session to be used when making calls to REST Endpoint. + + .EXAMPLE + Get-RsRestItemDataModelParameters -RsItem "/MyPbixReport1" + + Description + ----------- + Fetches data model parameter information associated to "MyReport" catalog item found in "/" folder from the Report Server located at http://localhost/reports. + + .EXAMPLE + Get-RsRestItemDataModelParameters -RsItem "/MyReport" -WebSession $session + + Description + ----------- + Fetches data model parameter information associated to "MyReport" catalog item found in "/" folder from the Report Server located at specificed WebSession object. + + .EXAMPLE + Get-RsRestItemDataModelParameters -RsItem "/MyReport" -ReportPortalUri http://myserver/reports + + Description + ----------- + Fetches data model parameter information associated to "MyReport" catalog item found in "/" folder from the Report Server located at http://myserver/reports. + #> + + [CmdletBinding()] + param( + [Parameter(Mandatory = $True)] + [Alias('ItemPath','Path')] + [string] + $RsItem, + + [string] + $ReportPortalUri, + + [Alias('ApiVersion')] + [ValidateSet("v2.0")] + [string] + $RestApiVersion = "v2.0", + + [Alias('ReportServerCredentials')] + [System.Management.Automation.PSCredential] + $Credential, + + [Microsoft.PowerShell.Commands.WebRequestSession] + $WebSession + ) + Begin + { + $WebSession = New-RsRestSessionHelper -BoundParameters $PSBoundParameters + $ReportPortalUri = Get-RsPortalUriHelper -WebSession $WebSession + $catalogItemsUri = $ReportPortalUri + "api/$RestApiVersion/CatalogItems(Path='{0}')" + $dataSourcesUri = $ReportPortalUri + "api/$RestApiVersion/{0}(Path='{1}')?`$expand=DataModelParameters" + } + Process + { + try + { + Write-Verbose "Fetching metadata for $RsItem..." + $catalogItemsUri = [String]::Format($catalogItemsUri, $RsItem) + if ($Credential -ne $null) + { + $response = Invoke-WebRequest -Uri $catalogItemsUri -Method Get -WebSession $WebSession -Credential $Credential -Verbose:$false + } + else + { + $response = Invoke-WebRequest -Uri $catalogItemsUri -Method Get -WebSession $WebSession -UseDefaultCredentials -Verbose:$false + } + + $item = ConvertFrom-Json $response.Content + $itemType = $item.Type + + Write-Verbose "Fetching data sources for $RsItem..." + $dataSourcesUri = [String]::Format($dataSourcesUri, $itemType + "s", $RsItem) + + if ($Credential -ne $null) + { + $response = Invoke-WebRequest -Uri $dataSourcesUri -Method Get -WebSession $WebSession -Credential $Credential -Verbose:$false + } + else + { + $response = Invoke-WebRequest -Uri $dataSourcesUri -Method Get -WebSession $WebSession -UseDefaultCredentials -Verbose:$false + } + + $itemWithDataSources = ConvertFrom-Json $response.Content + return $itemWithDataSources.DataModelParameters + } + catch + { + throw (New-Object System.Exception("Failed to get data model parameters for '$RsItem': $($_.Exception.Message)", $_.Exception)) + } + } +} \ No newline at end of file diff --git a/ReportingServicesTools/Functions/CatalogItems/Rest/Set-RsRestItemDataModelParameters.ps1 b/ReportingServicesTools/Functions/CatalogItems/Rest/Set-RsRestItemDataModelParameters.ps1 new file mode 100644 index 00000000..cf644ce0 --- /dev/null +++ b/ReportingServicesTools/Functions/CatalogItems/Rest/Set-RsRestItemDataModelParameters.ps1 @@ -0,0 +1,108 @@ +# Copyright (c) 2017 Microsoft Corporation. All Rights Reserved. +# Licensed under the MIT License (MIT) + +function Set-RsRestItemDataModelParameters +{ + <# + .SYNOPSIS + This script updates data sources related to a catalog item from the Report Server. + + .DESCRIPTION + This script updates data sources related to a catalog item from the Report Server. This is currently only applicable to Power BI Reports. + + .PARAMETER RsItem + Specify the location of the catalog item whose data sources will be updated. + + .PARAMETER DataModelParameters + Specify the data model parameters which were initially fetched via Get-RsRestItemDataModelParameters. + + .PARAMETER ReportPortalUri + Specify the Report Portal URL to your SQL Server Reporting Services Instance. + + .PARAMETER RestApiVersion + Specify the version of REST Endpoint to use. Valid values are: "v2.0". + + .PARAMETER Credential + Specify the credentials to use when connecting to the Report Server. + + .PARAMETER WebSession + Specify the session to be used when making calls to REST Endpoint. + + .EXAMPLE + $parameters = Get-RsRestItemDataModelParameters -RsItem '/MyPowerBIReport' + $parameters[0].Value = 'NewValue' + RsRestItemDataModelParameters -RsItem '/MyPowerBIReport' -DataModelParameters $parameters + + Description + ----------- + Updates data model parameters to the specified $parameters object. This example is only applicable for Power BI Reports. + #> + + [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Medium')] + param( + [Parameter(Mandatory = $True)] + [Alias('ItemPath','Path')] + [string] + $RsItem, + + [Parameter(Mandatory = $True)] + $DataModelParameters, + + [string] + $ReportPortalUri, + + [Alias('ApiVersion')] + [ValidateSet("v2.0")] + [string] + $RestApiVersion = "v2.0", + + [Alias('ReportServerCredentials')] + [System.Management.Automation.PSCredential] + $Credential, + + [Microsoft.PowerShell.Commands.WebRequestSession] + $WebSession + ) + Begin + { + $WebSession = New-RsRestSessionHelper -BoundParameters $PSBoundParameters + $ReportPortalUri = Get-RsPortalUriHelper -WebSession $WebSession + $dataModelParametersUri = $ReportPortalUri + "api/$RestApiVersion/PowerBIReports(Path='{0}')/DataModelParameters" + } + Process + { + try + { + $dataModelParametersUri = [String]::Format($dataModelParametersUri, $RsItem) + + # Converting $DataModelParameters into array as PowerBIReport(...)/DataModelParameters expects data model parameters + # to be in an array in the request body. If $DataModelParameters is already an array, this operation + # combines $DataModelParameters array with an empty array, so result is still an array. + $dataModelParametersArray = @($DataModelParameters) + + $payloadJson = ConvertTo-Json -InputObject $dataModelParametersArray -Depth 3 + + Write-Verbose "Payload for parameters: $($payloadJson)" + + $method = "POST" + + if ($PSCmdlet.ShouldProcess($RsItem, "Update data model parameters")) + { + Write-Verbose "Updating data model parameters for $($RsItem)..." + if ($Credential -ne $null) + { + Invoke-WebRequest -Uri $dataModelParametersUri -Method $method -Body ([System.Text.Encoding]::UTF8.GetBytes($payloadJson)) -ContentType "application/json" -WebSession $WebSession -Credential $Credential -Verbose:$false | Out-Null + } + else + { + Invoke-WebRequest -Uri $dataModelParametersUri -Method $method -Body ([System.Text.Encoding]::UTF8.GetBytes($payloadJson)) -ContentType "application/json" -WebSession $WebSession -UseDefaultCredentials -Verbose:$false | Out-Null + } + Write-Verbose "Data model parameters were updated successfully!" + } + } + catch + { + throw (New-Object System.Exception("Failed to update data model parameters for '$RsItem': $($_.Exception.Message)", $_.Exception)) + } + } +} \ No newline at end of file diff --git a/ReportingServicesTools/ReportingServicesTools.psd1 b/ReportingServicesTools/ReportingServicesTools.psd1 index 0f31c14e..796b271a 100644 --- a/ReportingServicesTools/ReportingServicesTools.psd1 +++ b/ReportingServicesTools/ReportingServicesTools.psd1 @@ -73,6 +73,7 @@ 'Get-RsItemDataSource', 'Get-RsItemReference', 'Get-RsRestItemDataSource', + 'Get-RsRestItemDataModelParameters', 'Get-RsRestItem', 'Get-RsSubscription', 'Grant-RsCatalogItemRole', @@ -109,6 +110,7 @@ 'Set-RsDataSourceReference', 'Set-RsEmailSettings', 'Set-RsItemDataSource', + 'Set-RsRestItemDataModelParameters'; 'Set-RsRestItemDataSource', 'Set-RsSubscription', 'Set-RsUrlReservation', From a09b56747497f9601e72f771a751d60797048fbb Mon Sep 17 00:00:00 2001 From: Guilherme Boreki Date: Mon, 5 Oct 2020 15:05:32 -0700 Subject: [PATCH 040/116] Tests --- ...et-RsRestItemDataModelParameters.Tests.ps1 | 52 +++++++++++++++ ...et-RsRestItemDataModelParameters.Tests.ps1 | 60 ++++++++++++++++++ .../testResources/DataModelParameters.pbix | Bin 0 -> 94102 bytes 3 files changed, 112 insertions(+) create mode 100644 Tests/CatalogItems/Rest/Get-RsRestItemDataModelParameters.Tests.ps1 create mode 100644 Tests/CatalogItems/Rest/Set-RsRestItemDataModelParameters.Tests.ps1 create mode 100644 Tests/CatalogItems/testResources/DataModelParameters.pbix diff --git a/Tests/CatalogItems/Rest/Get-RsRestItemDataModelParameters.Tests.ps1 b/Tests/CatalogItems/Rest/Get-RsRestItemDataModelParameters.Tests.ps1 new file mode 100644 index 00000000..961bc155 --- /dev/null +++ b/Tests/CatalogItems/Rest/Get-RsRestItemDataModelParameters.Tests.ps1 @@ -0,0 +1,52 @@ +# Copyright (c) 2017 Microsoft Corporation. All Rights Reserved. +# Licensed under the MIT License (MIT) + +$reportPortalUri = if ($env:PesterPortalUrl -eq $null) { 'http://localhost/reports' } else { $env:PesterPortalUrl } + +Describe "Get-RsRestItemDataModelParameters" { + $session = $null + $rsFolderPath = "" + $sqlPowerBIReport = "" + + BeforeEach { + $session = New-RsRestSession -ReportPortalUri $reportPortalUri + + # creating test folder + $folderName = 'SUT_GetRsRestItemDataModelParameters_' + [guid]::NewGuid() + New-RsRestFolder -WebSession $session -RsFolder / -FolderName $folderName + $rsFolderPath = '/' + $folderName + + # uploading test artifacts: dataModelParametersReport.rdl and DataModelParameters.pbix + $localPath = (Get-Item -Path ".\").FullName + '\Tests\CatalogItems\testResources' + + Write-RsRestCatalogItem -WebSession $session -Path "$localPath\DataModelParameters.pbix" -RsFolder $rsFolderPath + $sqlPowerBIReport = "$rsFolderPath/DataModelParameters" + } + + AfterEach { + # deleting test folder + Remove-RsRestFolder -WebSession $session -RsFolder $rsFolderPath -Confirm:$false + } + + Context "ReportPortalUri parameter" { + It "fetches data sources for power bi reports" { + $dataModelParameters = Get-RsRestItemDataModelParameters -ReportPortalUri $reportPortalUri -RsItem $sqlPowerBIReport -Verbose + $dataModelParameters[0].Name | Should Be "Databasename" + $dataModelParameters[0].Value | Should Be "ReportServer_2019" + } + } + + Context "WebSession parameter" { + $rsSession = $null + + BeforeEach { + $rsSession = New-RsRestSession -ReportPortalUri $reportPortalUri + } + + It "fetches data sources for power bi reports" { + $dataModelParameters = Get-RsRestItemDataModelParameters -WebSession $rsSession -RsItem $sqlPowerBIReport -Verbose + $dataModelParameters[0].Name | Should Be "Databasename" + $dataModelParameters[0].Value | Should Be "ReportServer_2019" + } + } +} \ No newline at end of file diff --git a/Tests/CatalogItems/Rest/Set-RsRestItemDataModelParameters.Tests.ps1 b/Tests/CatalogItems/Rest/Set-RsRestItemDataModelParameters.Tests.ps1 new file mode 100644 index 00000000..52eb4beb --- /dev/null +++ b/Tests/CatalogItems/Rest/Set-RsRestItemDataModelParameters.Tests.ps1 @@ -0,0 +1,60 @@ +# Copyright (c) 2017 Microsoft Corporation. All Rights Reserved. +# Licensed under the MIT License (MIT) + +$reportPortalUri = if ($env:PesterPortalUrl -eq $null) { 'http://localhost/reports' } else { $env:PesterPortalUrl } + +Describe "Set-RsRestItemDataModelParameters" { + $session = $null + $rsFolderPath = "" + $sqlPowerBIReport = "" + + BeforeEach { + $session = New-RsRestSession -ReportPortalUri $reportPortalUri + + # creating test folder + $folderName = 'SUT_SetRsRestItemDataModelParameters_' + [guid]::NewGuid() + New-RsRestFolder -WebSession $session -RsFolder / -FolderName $folderName + $rsFolderPath = '/' + $folderName + + # uploading test artifacts: dataModelParametersReport.rdl and DataModelParameters.pbix + $localPath = (Get-Item -Path ".\").FullName + '\Tests\CatalogItems\testResources' + + Write-RsRestCatalogItem -WebSession $session -Path "$localPath\DataModelParameters.pbix" -RsFolder $rsFolderPath + $sqlPowerBIReport = "$rsFolderPath/DataModelParameters" + } + + AfterEach { + # deleting test folder + Remove-RsRestFolder -WebSession $session -RsFolder $rsFolderPath -Confirm:$false + } + + Context "ReportPortalUri parameter" { + It "fetches data sources for power bi reports" { + $dataModelParameters = Get-RsRestItemDataModelParameters -ReportPortalUri $reportPortalUri -RsItem $sqlPowerBIReport -Verbose + $dataModelParameters[0].Value = "NewValue" + + Set-RsRestItemDataModelParameters -ReportPortalUri $reportPortalUri -RsItem $sqlPowerBIReport -DataModelParameters $dataModelParameters -Verbose + + $dataModelParameters = Get-RsRestItemDataModelParameters -ReportPortalUri $reportPortalUri -RsItem $sqlPowerBIReport -Verbose + $dataModelParameters[0].Value | Should Be "NewValue" + } + } + + Context "WebSession parameter" { + $rsSession = $null + + BeforeEach { + $rsSession = New-RsRestSession -ReportPortalUri $reportPortalUri + } + + It "fetches data sources for power bi reports" { + $dataModelParameters = Get-RsRestItemDataModelParameters -WebSession $rsSession -RsItem $sqlPowerBIReport -Verbose + $dataModelParameters[0].Value = "NewValue" + + Set-RsRestItemDataModelParameters -WebSession $rsSession -RsItem $sqlPowerBIReport -DataModelParameters $dataModelParameters -Verbose + + $dataModelParameters = Get-RsRestItemDataModelParameters -WebSession $rsSession -RsItem $sqlPowerBIReport -Verbose + $dataModelParameters[0].Value | Should Be "NewValue" + } + } +} \ No newline at end of file diff --git a/Tests/CatalogItems/testResources/DataModelParameters.pbix b/Tests/CatalogItems/testResources/DataModelParameters.pbix new file mode 100644 index 0000000000000000000000000000000000000000..be1b2ddb4035f6fcb084053dfcc1b70adaf29a6c GIT binary patch literal 94102 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

b>L8tfZb^R-bL&EAgzx!Mv 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 S-vYJ2BigF=OVn1Q&i?@w+#M Date: Mon, 12 Oct 2020 10:02:58 -0700 Subject: [PATCH 041/116] addressed comments --- .../Rest/Get-RsRestItemDataModelParameters.ps1 | 7 ++----- .../Rest/Set-RsRestItemDataModelParameters.ps1 | 7 ++----- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestItemDataModelParameters.ps1 b/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestItemDataModelParameters.ps1 index bd32da1f..d0254b99 100644 --- a/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestItemDataModelParameters.ps1 +++ b/ReportingServicesTools/Functions/CatalogItems/Rest/Get-RsRestItemDataModelParameters.ps1 @@ -5,10 +5,10 @@ function Get-RsRestItemDataModelParameters { <# .SYNOPSIS - This script fetches the Data Model Parameters related to a Catalog Item report from the Report Server + This script fetches the Data Model Parameters related to a Catalog Item report from the Report Server. This is currently only applicable to Power BI Reports and only from ReportServer October/2020 or higher. .DESCRIPTION - TThis script fetches the Data Model Parameters related to a Catalog Item report from the Report Server + TThis script fetches the Data Model Parameters related to a Catalog Item report from the Report Server. This is currently only applicable to Power BI Reports and only from ReportServer October/2020 or higher. .PARAMETER RsItem Specify the location of the catalog item whose data model parameters should be fetched. @@ -50,19 +50,16 @@ function Get-RsRestItemDataModelParameters [CmdletBinding()] param( [Parameter(Mandatory = $True)] - [Alias('ItemPath','Path')] [string] $RsItem, [string] $ReportPortalUri, - [Alias('ApiVersion')] [ValidateSet("v2.0")] [string] $RestApiVersion = "v2.0", - [Alias('ReportServerCredentials')] [System.Management.Automation.PSCredential] $Credential, diff --git a/ReportingServicesTools/Functions/CatalogItems/Rest/Set-RsRestItemDataModelParameters.ps1 b/ReportingServicesTools/Functions/CatalogItems/Rest/Set-RsRestItemDataModelParameters.ps1 index cf644ce0..11322853 100644 --- a/ReportingServicesTools/Functions/CatalogItems/Rest/Set-RsRestItemDataModelParameters.ps1 +++ b/ReportingServicesTools/Functions/CatalogItems/Rest/Set-RsRestItemDataModelParameters.ps1 @@ -8,7 +8,7 @@ function Set-RsRestItemDataModelParameters This script updates data sources related to a catalog item from the Report Server. .DESCRIPTION - This script updates data sources related to a catalog item from the Report Server. This is currently only applicable to Power BI Reports. + This script updates data sources related to a catalog item from the Report Server. This is currently only applicable to Power BI Reports and only from ReportServer October/2020 or higher. .PARAMETER RsItem Specify the location of the catalog item whose data sources will be updated. @@ -31,7 +31,7 @@ function Set-RsRestItemDataModelParameters .EXAMPLE $parameters = Get-RsRestItemDataModelParameters -RsItem '/MyPowerBIReport' $parameters[0].Value = 'NewValue' - RsRestItemDataModelParameters -RsItem '/MyPowerBIReport' -DataModelParameters $parameters + Set-RsRestItemDataModelParameters -RsItem '/MyPowerBIReport' -DataModelParameters $parameters Description ----------- @@ -41,7 +41,6 @@ function Set-RsRestItemDataModelParameters [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Medium')] param( [Parameter(Mandatory = $True)] - [Alias('ItemPath','Path')] [string] $RsItem, @@ -51,12 +50,10 @@ function Set-RsRestItemDataModelParameters [string] $ReportPortalUri, - [Alias('ApiVersion')] [ValidateSet("v2.0")] [string] $RestApiVersion = "v2.0", - [Alias('ReportServerCredentials')] [System.Management.Automation.PSCredential] $Credential, From 8903c63f776e436ca4c17a056f2f142a24698cde Mon Sep 17 00:00:00 2001 From: Jaime Tarquino Date: Mon, 12 Oct 2020 16:31:19 -0700 Subject: [PATCH 042/116] Comment out tests overwriting excel files --- .../Rest/Write-RsRestFolderContent.Tests.ps1 | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/Tests/CatalogItems/Rest/Write-RsRestFolderContent.Tests.ps1 b/Tests/CatalogItems/Rest/Write-RsRestFolderContent.Tests.ps1 index 49c85354..45ad63ed 100644 --- a/Tests/CatalogItems/Rest/Write-RsRestFolderContent.Tests.ps1 +++ b/Tests/CatalogItems/Rest/Write-RsRestFolderContent.Tests.ps1 @@ -67,12 +67,12 @@ Describe "Write-RsRestFolderContent" { { Write-RsRestFolderContent -ReportPortalUri $reportPortalUri -Path $localFolderPath -RsFolder $rsFolderPath -Verbose } | Should Throw } - - It "Overwrites exisiting resource if -Overwrite option is specified" { - Write-RsRestFolderContent -ReportPortalUri $reportPortalUri -Path $localFolderPath -RsFolder $rsFolderPath - - { Write-RsRestFolderContent -ReportPortalUri $reportPortalUri -Path $localFolderPath -RsFolder $rsFolderPath -Overwrite -Verbose } | Should Not Throw - } +# Commenting out until as server has changed behavior for xlsx files and cause error not being able to overwrite xlsx +# It "Overwrites exisiting resource if -Overwrite option is specified" { +# Write-RsRestFolderContent -ReportPortalUri $reportPortalUri -Path $localFolderPath -RsFolder $rsFolderPath +# +# { Write-RsRestFolderContent -ReportPortalUri $reportPortalUri -Path $localFolderPath -RsFolder $rsFolderPath -Overwrite -Verbose } | Should Not Throw +# } } Context "WebSession parameter" { @@ -107,15 +107,15 @@ Describe "Write-RsRestFolderContent" { { Write-RsRestFolderContent -WebSession $webSession -Path $localFolderPath -RsFolder $rsFolderPath -Verbose } | Should Throw } - - It "Overwrites exisiting resource, if -Overwrite option is specified" { - Write-RsRestFolderContent -WebSession $webSession -Path $localFolderPath -RsFolder $rsFolderPath - - { Write-RsRestFolderContent -WebSession $webSession -Path $localFolderPath -RsFolder $rsFolderPath -Overwrite -Verbose } | Should Not Throw - } +# Commenting out until as server has changed behavior for xlsx files and cause error not being able to overwrite xlsx +# It "Overwrites exisiting resource, if -Overwrite option is specified" { +# Write-RsRestFolderContent -WebSession $webSession -Path $localFolderPath -RsFolder $rsFolderPath +# +# { Write-RsRestFolderContent -WebSession $webSession -Path $localFolderPath -RsFolder $rsFolderPath -Overwrite -Verbose } | Should Not Throw +# } It "Do not halt even when folder already exists" { { Write-RsRestFolderContent -WebSession $webSession -Path $localFolderPath -RsFolder $rsFolderPath -Recurse -Verbose } | Should Not Throw } } -} \ No newline at end of file +} From fc2257bd24eb3d09ab60c3aa8833b3679e344c92 Mon Sep 17 00:00:00 2001 From: Aaron Nelson Date: Tue, 13 Oct 2020 13:02:52 -0400 Subject: [PATCH 043/116] Initial Commit (#288) Adding four functions to help automate deploying SSRS projects based on the deployment setting from the SSRS project file. --- .../CatalogItems/Get-RsDeploymentConfig.ps1 | 83 + .../CatalogItems/Publish-RsProject.ps1 | 159 + .../Common/MakeDeploymentFolders.ps1 | 18 + .../ReportingServicesTools.psd1 | 2 + .../Get-RsDeploymentConfig.Tests.ps1 | 21 + Tests/CatalogItems/Publish-RsProject.Test.ps1 | 31 + .../PerfDashboard.sln | 25 + .../SQL Server Performance Dashboard.rptproj | 75 + .../database_overview.rdl | 1312 +++++ .../database_storage_report.rdl | 2215 ++++++++ .../historical_io.rdl | 3800 +++++++++++++ .../historical_waits.rdl | 1668 ++++++ .../missing_index_from_showplan.rdl | 1124 ++++ .../missing_indexes.rdl | 1425 +++++ .../page_details.rdl | 1214 ++++ .../performance_dashboard_main.rdl | 3184 +++++++++++ .../plan_guide.rdl | 897 +++ .../query_plan.rdl | 2554 +++++++++ .../query_stats.rdl | 4089 ++++++++++++++ .../query_stats_details.rdl | 3807 +++++++++++++ .../recent_cpu.rdl | 4975 +++++++++++++++++ .../requests_overview.rdl | 1720 ++++++ .../session_details.rdl | 4206 ++++++++++++++ .../sessions_overview.rdl | 1617 ++++++ .../traces.rdl | 2512 +++++++++ .../wait_blocking.rdl | 2686 +++++++++ .../wait_buffer_io.rdl | 2203 ++++++++ .../wait_buflatch.rdl | 1296 +++++ .../wait_generic.rdl | 1557 ++++++ .../wait_latch.rdl | 1229 ++++ 30 files changed, 51704 insertions(+) create mode 100644 ReportingServicesTools/Functions/CatalogItems/Get-RsDeploymentConfig.ps1 create mode 100644 ReportingServicesTools/Functions/CatalogItems/Publish-RsProject.ps1 create mode 100644 ReportingServicesTools/Functions/Common/MakeDeploymentFolders.ps1 create mode 100644 Tests/CatalogItems/Get-RsDeploymentConfig.Tests.ps1 create mode 100644 Tests/CatalogItems/Publish-RsProject.Test.ps1 create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/PerfDashboard.sln create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/SQL Server Performance Dashboard.rptproj create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/database_overview.rdl create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/database_storage_report.rdl create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/historical_io.rdl create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/historical_waits.rdl create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/missing_index_from_showplan.rdl create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/missing_indexes.rdl create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/page_details.rdl create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/performance_dashboard_main.rdl create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/plan_guide.rdl create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/query_plan.rdl create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/query_stats.rdl create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/query_stats_details.rdl create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/recent_cpu.rdl create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/requests_overview.rdl create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/session_details.rdl create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/sessions_overview.rdl create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/traces.rdl create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/wait_blocking.rdl create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/wait_buffer_io.rdl create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/wait_buflatch.rdl create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/wait_generic.rdl create mode 100644 Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/wait_latch.rdl diff --git a/ReportingServicesTools/Functions/CatalogItems/Get-RsDeploymentConfig.ps1 b/ReportingServicesTools/Functions/CatalogItems/Get-RsDeploymentConfig.ps1 new file mode 100644 index 00000000..871e117c --- /dev/null +++ b/ReportingServicesTools/Functions/CatalogItems/Get-RsDeploymentConfig.ps1 @@ -0,0 +1,83 @@ +function Get-RsDeploymentConfig { + <# + .SYNOPSIS + This script retrieves a list of deployment configurations from a Reporting Services project file. + + .DESCRIPTION + This function This script retrieves a list of deployment configurations from a Reporting Services project file for deployment to a Power BI Report Server. + + .PARAMETER RsProjectFile + Specify the location of the SSRS project file whose deployment profiles should be fetched. + + .PARAMETER ConfigurationToUse + Specify which configuration to use from the SSRS project file, if you already know it's name. + + .EXAMPLE + Get-RsDeploymentConfig -RsProjectFile 'C:\Users\Aaron\source\repos\Finance\Financial Reports\SSRS_FR\SSRS_FR.rptproj' + + Description + ----------- + Retrieves all deployment profiles from the SSRS_FR.rptproj file and allows the user to choose which deployment configuration to use. + Then returns an object with all applicable settings from that deployment configuration. + + .EXAMPLE + $RSConfig = Get-RsDeploymentConfig -RsProjectFile 'C:\Users\Aaron\source\repos\Financial Reports\SSRS_FR\SSRS_FR.rptproj' + + Description + ----------- + Retrieves all deployment profiles from the SSRS_FR.rptproj file and allows the user to choose which deployment configuration to use. + After the selection is made, the applicable settings are stored in the $RSConfig variable. + + .EXAMPLE + $RSConfig = Get-RsDeploymentConfig -RsProjectFile 'C:\Users\Aaron\source\repos\Financial Reports\SSRS_FR\SSRS_FR.rptproj' -ConfigurationToUse Dev01 $RSConfig | + Add-Member -PassThru -MemberType NoteProperty -Name ReportPortal -Value 'http://localhost/PBIRSportal/' + $RSConfig | Deploy-RsProject + + Retrieves all deployment settings for the 'Dev01' deployment configuration, adds a NoteProperty for the ReportPortal to deploy to, + and then deploys all the project files by calling Deploy-RsProject and passing in all the settings in the $RSConfig variable. + #> + param ( + [Parameter(Mandatory = $true)] + [string]$RsProjectFile, + + [Parameter(Mandatory = $false)] + [string]$ConfigurationToUse + ) + + if($ConfigurationToUse){ + [XML]$rptproj = Get-Content $RsProjectFile + $Deployment = $rptproj.Project.PropertyGroup | where { $_.FullPath -eq $ConfigurationToUse } + + $RSConfig = [pscustomobject]@{ + FullPath = $Deployment.FullPath + OverwriteDatasets = $Deployment.OverwriteDatasets + OverwriteDataSources = $Deployment.OverwriteDataSources + TargetReportFolder = ($Deployment.TargetReportFolder).Trimend("/") + TargetDatasetFolder = ($Deployment.TargetDatasetFolder).Trimend("/") + TargetDatasourceFolder = ($Deployment.TargetDatasourceFolder).Trimend("/") + TargetReportPartFolder = ($Deployment.TargetReportPartFolder).Trimend("/") + TargetServerURL = $Deployment.TargetServerURL + RsProjectFolder = Split-Path -Path $RsProjectFile + } + + return $RSConfig + } + else{[XML]$rptproj = Get-Content $RsProjectFile + $ConfigurationToUse = $rptproj.Project.PropertyGroup.FullPath | ogv -PassThru + $Deployment = $rptproj.Project.PropertyGroup | where { $_.FullPath -eq $ConfigurationToUse } + + $RSConfig = [pscustomobject]@{ + FullPath = $Deployment.FullPath + OverwriteDatasets = $Deployment.OverwriteDatasets + OverwriteDataSources = $Deployment.OverwriteDataSources + TargetReportFolder = ($Deployment.TargetReportFolder).Trimend("/") + TargetDatasetFolder = ($Deployment.TargetDatasetFolder).Trimend("/") + TargetDatasourceFolder = ($Deployment.TargetDatasourceFolder).Trimend("/") + TargetReportPartFolder = ($Deployment.TargetReportPartFolder).Trimend("/") + TargetServerURL = $Deployment.TargetServerURL + RsProjectFolder = Split-Path -Path $RsProjectFile + } + + return $RSConfig + } +} \ No newline at end of file diff --git a/ReportingServicesTools/Functions/CatalogItems/Publish-RsProject.ps1 b/ReportingServicesTools/Functions/CatalogItems/Publish-RsProject.ps1 new file mode 100644 index 00000000..45de282e --- /dev/null +++ b/ReportingServicesTools/Functions/CatalogItems/Publish-RsProject.ps1 @@ -0,0 +1,159 @@ +function Publish-RsProject +{ + <# + .SYNOPSIS + This script deploys a Reporting Services project to a Power BI Report Server. + + .DESCRIPTION + This function deploys a full SSRS project to a Power BI Report Server. + + .PARAMETER ProjectFolder + Specify the location of the SSRS project file whose deployment profiles should be fetched. + + .EXAMPLE + Get-RsDeploymentConfig -ProjectFile 'C:\Users\Aaron\source\repos\Finance\Financial Reports\SSRS_FR\SSRS_FR.rptproj' | + Add-Member -PassThru -MemberType NoteProperty -Name ReportPortal -Value 'http://localhost/PBIRSportal/' | + Publish-RsProject + + Description + ----------- + Get-RsDeploymentConfig prompts the user to select which deployment configuration to use from + the 'C:\Users\Aaron\source\repos\Finance\Financial Reports\SSRS_FR\SSRS_FR.rptproj' project file. These settings + are piped to the Add-Member where the ReportPortal property is added and set to 'http://localhost/PBIRSportal/'. + The settings are then piped to the Publish-RsProject function, which deploys all project files using all applicable + settings from the deployment configuration chosen. + + .EXAMPLE + $RSConfig = Get-RsDeploymentConfig -RsProjectFile 'C:\Users\Aaron\source\repos\Financial Reports\SSRS_FR\SSRS_FR.rptproj' -ConfigurationToUse Dev01 + Add-Member -PassThru -MemberType NoteProperty -Name ReportPortal -Value 'http://localhost/PBIRSportal/' + $RSConfig | Publish-RsProject + + Description + ----------- + Retrieves all deployment settings for the 'Dev01' deployment configuration, adds a NoteProperty for the ReportPortal to + deploy to, and then deploys all the project files by calling Publish-RsProject and passing in all the settings in + the $RSConfig variable. + + .EXAMPLE + Publish-RsProject -TargetServerURL 'http://localhost/PBIRServer/' -ReportPortal 'http://localhost/PBIRSportal/' -TargetReportFolder /Finance -TargetDatasourceFolder '/Finance/Data Sources' -TargetDatasetFolder /Finance/DataSets -RsProjectFolder 'C:\Users\Aaron\source\repos\Financial Reports\SSRS_FR\' + + Description + ----------- + Deploys the project files found in the 'C:\Users\Aaron\source\repos\Financial Reports\SSRS_FR\' to the target locations + specified in the parameters list. Use this option when you want to deploy to a location not already listed in + the .rptproj project file. + #> + [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Medium')] + param ( + [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)] + [string]$RsProjectFolder, + + [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)] + [string]$TargetServerURL, + + [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)] + [string]$TargetReportFolder, + + [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)] + [string]$TargetDatasourceFolder, + + [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)] + [string]$TargetDatasetFolder, + + [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)] + [string]$TargetReportPartFolder, + + [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)] + [string]$OverwriteDatasets, + + [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)] + [string]$OverwriteDataSources, + + [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)] + [string]$FullPath, + + [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)] + [string]$ReportPortal + ) + + Write-Host "`$RsProjectFolder = '$RsProjectFolder' being used is + This deployment is going to happen using the following settings... + " + $RSConfig | FL + + <# RsFolder Structure + Make sure all the folders needed already exist with the following code. #> + Write-Host " + Beginning deployment. + Building folder structures... + " + + $TargetReportFolder, $TargetDatasourceFolder, $TargetDatasetFolder | + sort -Unique | + foreach { + MakeDeploymentFolders -RsFolder $_ -ReportPortal $ReportPortal + } + + <# Deploy Data Sources #> + Write-Host " + Deploying Data Sources to $($TargetDatasourceFolder)... + " + foreach($RDS in dir -Path $RsProjectFolder -Filter *.rds) + { + try{ Write-Verbose "Checking for $TargetDatasourceFolder/$($_.BaseName)" + Get-RsRestItem -ReportPortalUri $ReportPortal -RsItem "$TargetDatasourceFolder/$($RDS.BaseName)" | ft -AutoSize + } + catch{ Write-Verbose 'Did not find Data Source' + Write-RsRestCatalogItem -Path "$RsProjectFolder\$($RDS.Name)" -ReportPortalUri $ReportPortal -RsFolder $TargetDatasourceFolder + } + } + + <# Deploy Data Sets & set their Data Source References. #> + Write-Host " + Deploying DataSets to $TargetDatasetFolder... + " + dir -Path $RsProjectFolder -Filter *.rsd | + foreach{ + [XML]$dsetref = Get-Content "$RsProjectFolder\$($_.Name)" + $DataSetQuery = $dsetref.SharedDataSet.DataSet.Query + + $DSetConfig = [pscustomobject]@{ + DataSourceReference = $dsetref.SharedDataSet.DataSet.Query.DataSourceReference + CommandText = $dsetref.SharedDataSet.DataSet.Query.CommandText + CommandType = $dsetref.SharedDataSet.DataSet.Query.CommandType + DataSetParameters = $dsetref.SharedDataSet.DataSet.Query.DataSetParameters + } + + Write-RsRestCatalogItem -Path "$RsProjectFolder\$($_.Name)" -ReportPortalUri $ReportPortal -RsFolder $TargetDatasetFolder -Overwrite + Set-RsDataSourceReference -ReportServerUri $TargetServerURL -Path "$TargetDatasetFolder/$($_.BaseName)" -DataSourceName DataSetDataSource -DataSourcePath "$($TargetDatasourceFolder)/$($DSetConfig.DataSourceReference)" + } + + <# Deploy the Reports #> + Write-Host "Deploying the report files to $TargetReportFolder... + " + dir -Path $RsProjectFolder -Filter *.rdl | + foreach{ + $ReportName=$_.BaseName + Write-RsCatalogItem -Path "$RsProjectFolder\$($_.Name)" -ReportServerUri $TargetServerURL -RsFolder $TargetReportFolder -Overwrite + "$($_.BaseName)"; + Get-RsRestItemDataSource -ReportPortalUri $ReportPortal -RsItem "$TargetReportFolder/$ReportName" | + where {$_.IsReference -eq $true} | + foreach{ + Set-RsDataSourceReference -ReportServerUri $TargetServerURL -Path "$TargetReportFolder/$ReportName" -DataSourceName $_.Name -DataSourcePath "$($TargetDatasourceFolder)/$($_.Name)" + } + } + + <# Now read in the DataSet References directly from the report files and set them on the server #> + if($TargetDatasetFolder -ne $TargetReportFolder -and (Get-RsRestFolderContent -ReportPortalUri $ReportPortal -RsFolder $TargetDatasetFolder).Count -gt 0){ + $Reports = dir -Path $RsProjectFolder -Filter *.rdl + + foreach($Report in $Reports) + { + [XML]$ReportDSetRef = Get-Content $Report.FullName + foreach($SDS in $ReportDSetRef.Report.DataSets.DataSet){ + Set-RsDataSetReference -ReportServerUri $TargetServerURL -Path "$TargetReportFolder/$($Report.BaseName)" -DataSetName $SDS.Name -DataSetPath "$TargetDatasetFolder/$($SDS.SharedDataSet.SharedDataSetReference)" + } + } + } + +} \ No newline at end of file diff --git a/ReportingServicesTools/Functions/Common/MakeDeploymentFolders.ps1 b/ReportingServicesTools/Functions/Common/MakeDeploymentFolders.ps1 new file mode 100644 index 00000000..c5880840 --- /dev/null +++ b/ReportingServicesTools/Functions/Common/MakeDeploymentFolders.ps1 @@ -0,0 +1,18 @@ +function MakeDeploymentFolders { + param($RsFolder,$ReportPortal) + $tree=$null + $tree + $Base='/' + ($RsFolder.substring(1,$RsFolder.length-1)).split('/') | foreach{ + $Folder = $_ + $tree += "/"+$Folder + try{ + Get-RsRestItem -ReportPortalUri $ReportPortal -RsItem $tree| ft -AutoSize + } + catch{ + Write-Warning "Folder $tree does not exist"; + New-RsRestFolder -ReportPortalUri $ReportPortal -RsFolder $Base -FolderName $Folder -Verbose + } + $Base=$tree + } +} \ No newline at end of file diff --git a/ReportingServicesTools/ReportingServicesTools.psd1 b/ReportingServicesTools/ReportingServicesTools.psd1 index 0f31c14e..ccb083b3 100644 --- a/ReportingServicesTools/ReportingServicesTools.psd1 +++ b/ReportingServicesTools/ReportingServicesTools.psd1 @@ -68,6 +68,7 @@ 'Export-RsSubscriptionXml', 'Get-RsCatalogItemRole', 'Get-RsDataSource', + 'Get-RsDeploymentConfig', 'Get-RsFolderContent', 'Get-RsRestFolderContent', 'Get-RsItemDataSource', @@ -93,6 +94,7 @@ 'Out-RsFolderContent', 'Out-RsRestCatalogItem', 'Out-RsRestFolderContent', + 'Publish-RsProject', 'Register-RsPowerBI', 'Remove-RsCatalogItem', 'Remove-RsRestFolder', diff --git a/Tests/CatalogItems/Get-RsDeploymentConfig.Tests.ps1 b/Tests/CatalogItems/Get-RsDeploymentConfig.Tests.ps1 new file mode 100644 index 00000000..9469c3f8 --- /dev/null +++ b/Tests/CatalogItems/Get-RsDeploymentConfig.Tests.ps1 @@ -0,0 +1,21 @@ + +Describe "Get-RsDeploymentConfig" { + $RSConfig = Get-RsDeploymentConfig -RsProjectFile "$($PSScriptRoot)\TestProjects\SQLServerPerformanceDashboardReportingSolution\SQL Server Performance Dashboard\SQL Server Performance Dashboard.rptproj" -ConfigurationToUse Release + + Write-Verbose "$RSConfig.TargetServerURL" + Write-Verbose "$RSConfig.RsProjectFolder" + + Context "Get the DeploymentConfig of a ReportServer project file using ConfigurationToUse parameter"{ + # Create a folder + # Test if the config was found + It "Should verify TargetServerURL matches" { + $RSConfig.TargetServerURL | Should Be 'http://localhost/reportserver' + } + + # Test if the folder can be found + It "Should verify a config was retrieved" { + @($RSConfig).Count | Should Be 1 + } + + } +} \ No newline at end of file diff --git a/Tests/CatalogItems/Publish-RsProject.Test.ps1 b/Tests/CatalogItems/Publish-RsProject.Test.ps1 new file mode 100644 index 00000000..e1c9e44e --- /dev/null +++ b/Tests/CatalogItems/Publish-RsProject.Test.ps1 @@ -0,0 +1,31 @@ +$reportPortalUri = if ($env:PesterPortalUrl -eq $null) { 'http://localhost/reports' } else { $env:PesterPortalUrl } + +Describe "Publish-RsProject" { + Context "Deploy an entire SSRS Project by getting the DeploymentConfig of a ReportServer project file using ConfigurationToUse parameter"{ + # Create a folder + $RSConfig = Get-RsDeploymentConfig -RsProjectFile "$($PSScriptRoot)\TestProjects\SQLServerPerformanceDashboardReportingSolution\SQL Server Performance Dashboard\SQL Server Performance Dashboard.rptproj" -ConfigurationToUse Release | + Add-Member -PassThru -MemberType NoteProperty -Name ReportPortal -Value $reportPortalUri + + # Test if the config was retrieved + It "Should verify a config was retrieved" { + @($RSConfig).Count | Should Be 1 + } + + # Test if the TargetServerURL in the config was found + It "Should verify TargetServerURL matches" { + $RSConfig.TargetServerURL | Should Be 'http://localhost/reportserver' + } + + $RSConfig | Publish-RsProject + $CatalogList = Get-RsRestFolderContent -reportPortalUri $RSConfig.ReportPortal -RsFolder '/SQL Server Performance Dashboard' -Recurse + $folderCount = ($CatalogList | measure).Count + It "Should find at least 1 folder" { + $folderCount | Should Be 22 + } + # Removing folders used for testing + Remove-RsCatalogItem -RsFolder $RSConfig.TargetReportFolder -Confirm:$false + Remove-RsCatalogItem -RsFolder $RSConfig.TargetDatasetFolder -Confirm:$false + Remove-RsCatalogItem -RsFolder $RSConfig.TargetDatasourceFolder -Confirm:$false + + } +} \ No newline at end of file diff --git a/Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/PerfDashboard.sln b/Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/PerfDashboard.sln new file mode 100644 index 00000000..2c626dbe --- /dev/null +++ b/Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/PerfDashboard.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{F14B399A-7131-4C87-9E4B-1186C45EF12D}") = "SQL Server Performance Dashboard", "SQL Server Performance Dashboard\SQL Server Performance Dashboard.rptproj", "{280F4418-C6F5-4763-8CA4-63AD770AFB58}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Default = Debug|Default + DebugLocal|Default = DebugLocal|Default + Release|Default = Release|Default + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {280F4418-C6F5-4763-8CA4-63AD770AFB58}.Debug|Default.ActiveCfg = Debug + {280F4418-C6F5-4763-8CA4-63AD770AFB58}.Debug|Default.Build.0 = Debug + {280F4418-C6F5-4763-8CA4-63AD770AFB58}.Debug|Default.Deploy.0 = Debug + {280F4418-C6F5-4763-8CA4-63AD770AFB58}.DebugLocal|Default.ActiveCfg = DebugLocal + {280F4418-C6F5-4763-8CA4-63AD770AFB58}.DebugLocal|Default.Build.0 = DebugLocal + {280F4418-C6F5-4763-8CA4-63AD770AFB58}.Release|Default.ActiveCfg = Release + {280F4418-C6F5-4763-8CA4-63AD770AFB58}.Release|Default.Build.0 = Release + {280F4418-C6F5-4763-8CA4-63AD770AFB58}.Release|Default.Deploy.0 = Release + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/SQL Server Performance Dashboard.rptproj b/Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/SQL Server Performance Dashboard.rptproj new file mode 100644 index 00000000..f2957c54 --- /dev/null +++ b/Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/SQL Server Performance Dashboard.rptproj @@ -0,0 +1,75 @@ + + + + Debug + bin\Debug + 2 + False + False + SSRS2008R2 + Win32 + SQL Server Performance Dashboard + Datasets + Data Sources + Report Parts + http://localhost/reportserver + + + DebugLocal + bin\DebugLocal + 2 + False + False + SSRS2008R2 + Win32 + SQL Server Performance Dashboard + Datasets + Data Sources + Report Parts + + + Release + bin\Release + 2 + False + False + SSRS2008R2 + Win32 + /SQL Server Performance Dashboard + /Datasets + /Data Sources + Report Parts + http://localhost/reportserver + + + $base64$PFNvdXJjZUNvbnRyb2xJbmZvIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmRkbDI9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDAzL2VuZ2luZS8yIiB4bWxuczpkZGwyXzI9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDAzL2VuZ2luZS8yLzIiIHhtbG5zOmRkbDEwMF8xMDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDA4L2VuZ2luZS8xMDAvMTAwIiB4bWxuczpkZGwyMDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEwL2VuZ2luZS8yMDAiIHhtbG5zOmRkbDIwMF8yMDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEwL2VuZ2luZS8yMDAvMjAwIiB4bWxuczpkZGwzMDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDExL2VuZ2luZS8zMDAiIHhtbG5zOmRkbDMwMF8zMDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDExL2VuZ2luZS8zMDAvMzAwIiB4bWxuczpkZGw0MDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEyL2VuZ2luZS80MDAiIHhtbG5zOmRkbDQwMF80MDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEyL2VuZ2luZS80MDAvNDAwIiB4bWxuczpkZGw1MDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEzL2VuZ2luZS81MDAiIHhtbG5zOmRkbDUwMF81MDA9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vYW5hbHlzaXNzZXJ2aWNlcy8yMDEzL2VuZ2luZS81MDAvNTAwIiB4bWxuczpkd2Q9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vRGF0YVdhcmVob3VzZS9EZXNpZ25lci8xLjAiPg0KICA8RW5hYmxlZD5mYWxzZTwvRW5hYmxlZD4NCiAgPFByb2plY3ROYW1lPjwvUHJvamVjdE5hbWU+DQogIDxBdXhQYXRoPjwvQXV4UGF0aD4NCiAgPExvY2FsUGF0aD48L0xvY2FsUGF0aD4NCiAgPFByb3ZpZGVyPjwvUHJvdmlkZXI+DQo8L1NvdXJjZUNvbnRyb2xJbmZvPg== + @(DataSource) + @(DataSet) + @(Report) + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/database_overview.rdl b/Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/database_overview.rdl new file mode 100644 index 00000000..82a53c4d --- /dev/null +++ b/Tests/CatalogItems/TestProjects/SQLServerPerformanceDashboardReportingSolution/SQL Server Performance Dashboard/database_overview.rdl @@ -0,0 +1,1312 @@ + + + + + + + + + 1in + + + 3in + + + 0.875in + + + 0.75in + + + 0.875in + + + 0.875in + + + 1in + + + 1in + + + 1in + + + 0.75in + + + 1.5in + + + 1.375in + + + + + 0.375in + + + + + true + + =Fields!database_id.Value + + true + + + + + Database ID + + + + + + + textbox2 + 23 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!name.Value + + true + + + + + Database Name + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!compatibility_level.Value + + true + + + + + Compat Level + + + + + + + 21 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!is_parameterization_forced.Value + + true + + + + + Param Level + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!is_auto_create_stats_on.Value + + true + + + + + Auto Create Stats + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!is_auto_update_stats_async_on.Value + + true + + + + + Auto Update Stats + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!recovery_model_desc.Value + + true + + + + + Recovery Model + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!Data_File_s__Size__MB_.Value + + true + + + + + Data File Size (MB) + + + + + + + textbox10 + 16 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!Log_File_s__Size__MB_.Value + + true + + + + + Log File Size (MB) + + + + + + + textbox14 + 15 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!Percent_Log_Used.Value + + true + + + + + % Log Used + + + + + + + textbox17 + 14 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!log_reuse_wait_desc.Value + + true + + + + + Log Reuse Wait Description + + + + + + + textbox11 + 13 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!page_verify_option_desc.Value + + true + + + + + Page Verify Option + + + + + + + textbox13 + 12 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + =Fields!database_id.Value + + + + + + + database_id + 11 + + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!name.Value + + + + + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!compatibility_level.Value + + + + + + + compatibility_level + 9 + + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =IIf(Fields!is_parameterization_forced.Value = true, "FORCED", "SIMPLE") + + + + + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =IIf(Fields!is_auto_create_stats_on.Value = true, "Enabled", "Disabled") + + + + + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =IIf(Fields!is_auto_update_stats_on.Value = true, "Enabled" & IIf(Fields!is_auto_update_stats_async_on.Value = true, " Async", ""), "Disabled") + + + + + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!recovery_model_desc.Value + + + + + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!Data_File_s__Size__MB_.Value + + + + + + + Data_File_s__Size__KB_ + 4 + + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!Log_File_s__Size__MB_.Value + + + + + + + Log_File_s__Size__KB_ + 3 + + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!Percent_Log_Used.Value + + + + + + + Percent_Log_Used + 2 + + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!log_reuse_wait_desc.Value + + + + + + + textbox12 + 1 + + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!page_verify_option_desc.Value + + + + + + + textbox15 + + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + After + true + + + + Detail + + + + =Fields!database_id.Value + + + + + + Detail_Collection + Output + true + + + + DATABASE_OVERVIEW + 0.125in + 0.125in + 0.575in + 14in + + + + 0.7in + + + + + + + true + true + + + + + ="Report Local Time: " & Globals!ExecutionTime + + + + + + + 0.375in + 0.125in + 0.25in + 2.875in + 1 + + + + Embedded + sql_logo + Fit + 9.125in + 0.5in + 1.75in + 2 + + + + + + + true + true + + + + + ="Dashboard Version: " + Parameters!version_string.Value + + + + + + + 7.75in + 0.25in + 3.125in + 1 + + + + + + true + Top + + + + + + + 1 + + False + + + + + + + + + 0.5 + + NaN + NaN + NaN + 90 + true + Rotate45 + 8pt + + + + Axis Title + + + + False + + + + + + + + + 0.5 + + NaN + Opposite + NaN + NaN + + + + + + + Number + + False + + + + + + + + + 0.5 + + NaN + NaN + NaN + + true + + + Axis Title + + + + + + + + + + + + 0.5 + + NaN + Opposite + NaN + NaN + + + + + + + Drive Free Space in GB + + + + BrightPastel + + + + + No Data Available + + + DiskFreeSpace + 2.68973in + 0.15625in + 2.52082in + 9.60167in + + + None + + + + + + true + true + + + + + Server Information + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + Machine Name + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + =": " & First(Fields!MachineName.Value, "ServerInfo") + + + + + + + Textbox4 + 0.55209in + 1.67014in + 0.26042in + 1.90278in + 2 + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + Logical Processors + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + =": " & First(Fields!Logical_Processors.Value, "ServerInfo") + + + + + + + Textbox4 + 0.88195in + 1.67014in + 0.26042in + 1.14236in + 4 + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + Physical Memory: + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + =": " & First(Fields!Physical_Memory.Value, "ServerInfo") & " GB" + + + + + + + Textbox4 + 1.21181in + 1.67014in + 0.26042in + 1.16319in + 6 + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + Clustered: + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + =": " & First(Fields!Clustered.Value, "ServerInfo") + + + + + + + Textbox4 + 1.54168in + 1.67014in + 0.26042in + 1.16319in + 8 + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + =": " & First(Fields!SQL_Instance.Value, "ServerInfo") + + + + + + + Textbox4 + 0.55209in + 4.99876in + 0.26042in + 1.96527in + 9 + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + =": " & First(Fields!SQL_Version.Value, "ServerInfo") + + + + + + + Textbox4 + 0.88195in + 4.99876in + 0.26042in + 1.44444in + 10 + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + SQL Build: + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + Instance Name: + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + SQL Version: + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + =": " & First(Fields!Version.Value, "SQLVersion") + + + + + + + Textbox4 + 1.21181in + 4.99876in + 0.26042in + 2.84027in + 14 + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + SQL Start Time: + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + =": " & First(Fields!SQL_Server_Start_Time.Value, "SQLStarttime") + + + + + + + Textbox4 + 1.54168in + 4.99876in + 0.24653in + 2.30903in + 16 + + + 2pt + 2pt + 2pt + 2pt + + + + true + 0.65848in + 0.15625in + 2.03125in + 9.60167in + 1 + + + + + + true + true + + + + + ="Database Space Report For " & First(Fields!SQL_Instance.Value, "ServerInfo") & " On " & Today() + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + =Fields!Drive.Value + + + + + =Fields!Drive.Value + + + + + + + =Fields!dbname.Value + + + + + =Fields!dbname.Value + + + + + + + =Fields!filename.Value + + + + + =Fields!Freespace.Value + Descending + + + + + + + + + + + + + + + + + + + + + + + + + + + + + =Sum(Fields!PctSpaceUsed.Value) + + + + + true + + + + true + + + + + + + 1 + + False + + + + + + + + + 0.5 + + NaN + NaN + NaN + 90 + true + Rotate45 + true + 8pt + 8pt + + + + Axis Title + + + + False + + + + + + + + + 0.5 + + NaN + Opposite + NaN + NaN + + + + + + + Number + + False + + + + + + + + + 0.5 + + NaN + NaN + NaN + + true + + + Axis Title + + + + + + + + + + + + 0.5 + + NaN + Opposite + NaN + NaN + + + + + + + + TopRight + + + + + Black + Black + + + + + % Free Space in Data Files + + + + BrightPastel + + + + + No Data Available + + + DatabaseSpaceUsage + 5.21055in + 0.15625in + 4in + 9.60167in + 3 + + + None + + + + + + + 1.84375in + + + 1.56472in + + + 4.28472in + + + 0.67931in + + + 0.63541in + + + 0.59375in + + + + + 0.29688in + + + + + true + + =Fields!dbname.Value + + true + + + + + Database + + + + + + CornflowerBlue + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + FileName + + + + + + + Black + + 1pt + + + Black + + 1pt + + + Black + + 1pt + + + Black + + 1pt + + CornflowerBlue + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Physical Name + + + + + + + Black + + 1pt + + + Black + + 1pt + + + Black + + 1pt + + + Black + + 1pt + + CornflowerBlue + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!TotalSize.Value + + true + + + + + Total Size (MB) + + + + + + CornflowerBlue + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!SpaceUsed.Value + + true + + + + + Space Used (MB) + + + + + + CornflowerBlue + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!Freespace.Value + + true + + + + + Freespace (MB) + + + + + + CornflowerBlue + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.29688in + + + + + true + true + + + + + =Fields!dbname.Value + + + + + + + Black + + 1pt + + + Black + + 1pt + + + Black + + 1pt + + + Black + + 1pt + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!filename.Value + + + + + + + Black + + 1pt + + + Black + + 1pt + + + Black + + 1pt + + + Black + + 1pt + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!physicalname.Value + + + + + + + Black + + 1pt + + + Black + + 1pt + + + Black + + 1pt + + + Black + + 1pt + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!TotalSize.Value + + + + + + + Black + + 1pt + + + Black + + 1pt + + + Black + + 1pt + + + Black + + 1pt + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!SpaceUsed.Value + + + + + + + Black + + 1pt + + + Black + + 1pt + + + Black + + 1pt + + + Black + + 1pt + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!Freespace.Value + + + + + + + Black + + 1pt + + + Black + + 1pt + + + Black + + 1pt + + + Black + + 1pt + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + + + After + + + + + + + DatabaseSpaceUsage + 9.21055in + 0.15626in + 0.59376in + 9.60166in + 4 + + + + + + 9.80431in + + + + + + + Textbox31 + 0.20139in + 6.75917in + 0.25in + 2.99875in + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 10in + 10in + + + + + + + + + + 0.25in + + + 1in + + + 2.25in + + + 1.125in + + + 1in + + + 1.5in + + + 1.375in + + + 1.125in + + + 1.125in + + + + + 0.2in + + + + + true + true + + + + + =Fields!database_name.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + 3 + + + + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + + + + + + + + + + + + 0.2in + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + Object ID + + + + + + + textbox15 + 16 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Object Name + + + + + + + textbox6 + 15 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Missing Index + + + + + + + 14 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + IO waits + + + + + + + 13 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + IO wait time (ms) + + + + + + + 12 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg IO Wait (ms) + + + + + + + textbox16 + 11 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Range Scans + + + + + + + textbox26 + 10 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Index Lookups + + + + + + + textbox38 + 9 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + =Fields!object_id.Value + + + + + + + object_id + 7 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!object_name.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =IIf(Fields!missing_index_identified.Value = "Y", "Yes", "No") + + + + + + + missing_index_identified + + + + + =IIf(Fields!missing_index_identified.Value = "Y", "missing_indexes", nothing) + + + =Parameters!version_string.Value + + + =Fields!database_id.Value + + + =Fields!object_id.Value + + + + + + + 5 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!page_io_latch_wait_count.Value + + + + + + + page_io_latch_wait_count + 4 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!page_io_latch_wait_in_ms.Value + + + + + + + page_io_latch_wait_in_ms_1 + 3 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =IIF(Fields!page_io_latch_wait_count.Value > 0, Fields!page_io_latch_wait_in_ms.Value / Fields!page_io_latch_wait_count.Value, "") + + + + + + + textbox17 + 2 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!range_scans.Value + + + + + + + range_scans + 1 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!index_lookups.Value + + + + + + + index_lookups + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + + + + + + + + =Fields!database_id.Value + + + + + =Fields!database_name.Value + + + + + After + true + + + + true + db_name + + After + true + + + + Detail + + + + + true + db_name + + + + Detail_Collection + Output + true + + + + + + LARGEST_IO_OBJECTS + 2.75in + 0.125in + 0.6in + 10.75in + 1 + + + + + + + textbox2 + 59 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 3 + + + + + + + + true + true + + + + + % Reads + + + + + + + textbox44 + 58 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Sum(Fields!num_of_reads.Value) + table1_Group1 + + true + + + + + Reads + + + + + + + textbox30 + 57 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Read Wait Time (ms) + + + + + + + textbox78 + 56 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg Read Wait (ms) + + + + + + + textbox85 + 55 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + % Writes + + + + + + + textbox35 + 54 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Sum(Fields!num_of_writes.Value) + table1_Group1 + + true + + + + + Writes + + + + + + + textbox42 + 53 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Write Wait Time (ms) + + + + + + + textbox50 + 52 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg Write Wait (ms) + + + + + + + textbox9 + 51 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + % Total IO + + + + + + + 50 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + =First(Fields!database_name.Value) + + + + + + 2pt + 2pt + 2pt + 2pt + + + 3 + + + + + + + + true + true + + + + + =FormatPercent(Sum(Fields!num_of_reads.Value) / Sum(Fields!num_of_reads.Value, "DATABASE_FILE_IO")) + + + + + + + pct_total_reads + 48 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Sum(Fields!num_of_reads.Value) + + + + + + + num_of_reads_1 + 47 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Sum(Fields!io_stall_read_ms.Value) + + + + + + + textbox79 + 46 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =IIf(Sum(Fields!num_of_reads.Value) > 0, FormatNumber(Sum(Fields!io_stall_read_ms.Value) / Sum(Fields!num_of_reads.Value), 1), nothing) + + + + + + + textbox86 + 45 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatPercent(Sum(Fields!num_of_writes.Value) / sum(Fields!num_of_writes.Value, "DATABASE_FILE_IO")) + + + + + + + pct_total_writes + 44 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Sum(Fields!num_of_writes.Value) + + + + + + + num_of_writes + 43 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Sum(Fields!io_stall_write_ms.Value) + + + + + + + textbox52 + 42 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =IIf(Sum(Fields!num_of_writes.Value) > 0, FormatNumber(Sum(Fields!io_stall_write_ms.Value) / Sum(Fields!num_of_writes.Value), 1), nothing) + + + + + + + 41 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatPercent((Sum(Fields!num_of_reads.Value) + Sum(Fields!num_of_writes.Value)) / (Sum(Fields!num_of_reads.Value, "DATABASE_FILE_IO") + Sum(Fields!num_of_writes.Value, "DATABASE_FILE_IO")), 2) + + + + + + + pct_total_ios + 40 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + + + + + + + + textbox29 + 39 + + + + + + + + true + true + + + + + File Name + + + + + + + 38 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 2 + + + + + + + true + true + + + + + % Reads + + + + + + + textbox46 + 37 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Reads + + + + + + + textbox51 + 36 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Read Wait Time (ms) + + + + + + + textbox80 + 35 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg Read Wait (ms) + + + + + + + textbox87 + 34 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + % Writes + + + + + + + textbox41 + 33 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Writes + + + + + + + textbox55 + 32 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Write Wait Time (ms) + + + + + + + textbox53 + 31 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg Write Wait (ms) + + + + + + + textbox22 + 30 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + % Total IO + + + + + + + 29 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + + + + + + + + textbox25 + 28 + + + + + + + + true + true + + + + + =Fields!file_name.Value + + + + + + + file_name + 27 + + + 2pt + 2pt + 2pt + 2pt + + + 2 + + + + + + + true + true + + + + + =FormatPercent((Fields!num_of_reads.Value) / sum(Fields!num_of_reads.Value, "table1_Group1")) + + + + + + + pct_total_reads_1 + 26 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!num_of_reads.Value + + + + + + + num_of_reads_2 + 25 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!io_stall_read_ms.Value + + + + + + + io_stall_read_ms + 24 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =IIf(Fields!num_of_reads.Value > 0, FormatNumber(Fields!io_stall_read_ms.Value / Fields!num_of_reads.Value, 2), nothing) + + + + + + + io_stall_read_ms_1 + 23 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatPercent((Fields!num_of_writes.Value) / sum(Fields!num_of_writes.Value, "table1_Group1")) + + + + + + + pct_total_writes_1 + 22 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!num_of_writes.Value + + + + + + + num_of_writes_1 + 21 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!io_stall_write_ms.Value + + + + + + + io_stall_write_ms + 20 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =IIf(Fields!num_of_writes.Value > 0, Fields!io_stall_write_ms.Value / Fields!num_of_writes.Value, nothing) + + + + + + + io_stall_write_ms_1 + 19 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatPercent((Fields!num_of_reads.Value + Fields!num_of_writes.Value) / (sum(Fields!num_of_reads.Value, "table1_Group1") + sum(Fields!num_of_writes.Value, "table1_Group1")), 2) + + + + + + + pct_total_ios_2 + 18 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + + + + + + + + textbox5 + 17 + + + + + + + + true + true + + + + + Type + + + + + + + textbox36 + 16 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Physical File Name + + + + + + + 15 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 10 + + + + + + + + + + + + + + + 0.2in + + + + + true + true + + + + + + + + + + + + textbox18 + 2 + + + + + + + + true + true + + + + + =Fields!type_desc.Value + + + + + + + type_desc + 1 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!physical_name.Value + + + + + + + physical_name + + + 2pt + 2pt + 2pt + 2pt + + + 10 + + + + + + + + + + + + + + + 0.2in + + + + + true + true + + + + + + + + + + + + textbox33 + 14 + + + + + + + + true + true + + + + + + + + + + + + textbox59 + 13 + + + + + + + + true + true + + + + + Grand Total + + + + + + + textbox43 + 12 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatPercent(1, 0) + + + + + + + pct_total_reads_2 + 11 + + + + Black + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Sum(Fields!num_of_reads.Value) + + + + + + + num_of_reads_3 + 10 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Sum(Fields!io_stall_read_ms.Value) + + + + + + + io_stall_read_ms_2 + 9 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =IIf(sum(Fields!num_of_reads.Value) > 0, FormatNumber(Sum(Fields!io_stall_read_ms.Value) / sum(Fields!num_of_reads.Value), 1), nothing) + + + + + + + io_stall_read_ms_3 + 8 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatPercent(1, 0) + + + + + + + pct_total_writes_2 + 7 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Sum(Fields!num_of_writes.Value) + + + + + + + num_of_writes_2 + 6 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Sum(Fields!io_stall_write_ms.Value) + + + + + + + io_stall_write_ms_2 + 5 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =IIf(sum(Fields!num_of_writes.Value) > 0, FormatNumber(Sum(Fields!io_stall_write_ms.Value)/sum(Fields!num_of_writes.Value), 1), nothing) + + + + + + + io_stall_write_ms_3 + 4 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatPercent(1, 0) + + + + + + + pct_total_ios_1 + 3 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + After + true + + + + + =Fields!database_id.Value + + + + + =Fields!database_name.Value + + + + + After + true + + + + true + database_name_1 + + After + true + + + + Detail + + + + + true + database_name_1 + + + + + true + file_name + + + + + true + file_name + + + + Detail_Collection + Output + true + + + + + Before + true + + + + DATABASE_FILE_IO + 0.5in + 0.125in + 1.575in + 13.5in + 2 + + + + + + + 3.35in + + + + + + + true + true + + + + + ="Report Local Time: " & Globals!ExecutionTime + + + + + + + 0.375in + 0.125in + 0.25in + 3in + 1 + + + + Embedded + sql_logo + Fit + 9.125in + 0.5in + 1.75in + 2 + + + + + + + true + true + + + + + ="Dashboard Version: " + Parameters!version_string.Value + + + + + + + 7.625in + 0.25in + 3.125in + 1 + + + + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 2 + + + + + + + true + + =Sum(Fields!num_waits.Value) + table2_Group1 + + true + + + + + Number of Waits + + + + + + + textbox19 + 24 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Sum(Fields!wait_time.Value) + table2_Group1 + + true + + + + + Wait Time (sec) + + + + + + + textbox20 + 23 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =FormatPercent(Sum(Fields!wait_time.Value) / sum(Fields!wait_time.Value, "DM_OS_WAIT_STATS"), 2) + table2_Group1 + + true + + + + + % Wait Time + + + + + + + textbox13 + 22 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + + + + + + + + + + + + 0.2in + + + + + true + true + + + + + =Fields!wait_category.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + 2 + + + + + + + true + true + + + + + =Sum(Fields!num_waits.Value) + + + + + + + num_waits + 18 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Sum(Fields!wait_time.Value)/1000 + + + + + + + wait_time + 17 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatPercent(Sum(Fields!wait_time.Value) / sum(Fields!wait_time.Value, "DM_OS_WAIT_STATS"), 2) + + + + + + + textbox8 + 16 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + + + + + + + + + + + + 0.2in + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + Wait Type + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!num_waits.Value + + true + + + + + Number of Waits + + + + + + + textbox6 + 11 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!wait_time.Value + + true + + + + + Wait Time (sec) + + + + + + + textbox7 + 10 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + % Wait time + + + + + + + 9 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Max Wait Time (ms) + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg Wait Time (ms) + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + =Fields!wait_type.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!num_waits.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_time.Value/1000 + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatPercent(IIf(sum(Fields!wait_time.Value, "table2_Group1") > 0, Fields!wait_time.Value/sum(Fields!wait_time.Value, "table2_Group1"), 1), 2) + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!max_wait_time_ms.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!wait_time.Value/Fields!num_waits.Value, 1, true, false, false) + + + + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + + + + After + true + + + + + =Fields!wait_category.Value + + + + + =sum(Fields!wait_time.Value) + Descending + + + + + After + true + + + + true + wait_category + + After + true + + + + Detail + + + + =Fields!wait_time.Value + Descending + + + + + + true + wait_category + + + + Detail_Collection + Output + true + + + + + + DM_OS_WAIT_STATS + 0.8in + 9.125in + + + + true + true + + + + + Waits in the Idle category are typically delays incurred by background tasks waiting for more work. A high wait time in this category is usually not indicative of any performance problem. + + + + + + + ContentsOnly + 4.75in + 0.125in + 1.25in + 9.25in + + + true + -90 + + + + 6pt + + 0.75pt + + + + Wait Category + + + False + 1 + + False + + 0.75pt + + + NaN + + + False + + 0.75pt + + + NaN + -1 + + + True + + 0.75pt + + + NaN + + + None + + NaN + NaN + true + true + false + + + + + + + NaN + Opposite + NaN + NaN + + + 0.75pt + + + + Wait Time (sec) + + + True + + True + + 0.75pt + + + NaN + + + False + + 0.75pt + + + NaN + + + True + + 0.75pt + + + NaN + + + None + + true + 0 + true + true + false + + + + + + + NaN + Opposite + NaN + NaN + + + 0.75pt + + LightGrey + + + + + + true + + 0.75pt + + + RightCenter + Column + + + + + true + + + + + Cumulative Wait Time By Wait Category + + + + + + + + No Data Available + + + DM_OS_WAIT_STATS + 4.25in + 10.5in + + + __Upgraded2005__ + __Upgraded2005__ + + + + + + ContentsOnly + 0.125in + 0.125in + 4.5in + 10.625in + 1 + + =IIf(Count(Fields!wait_type.Value, "DM_OS_WAIT_STATS") = 0, true, false) + + + + + + + + true + true + + + + + ="Report Local Time: " & Globals!ExecutionTime + + + + + + + 0.375in + 0.125in + 0.25in + 2.625in + 1 + + + + Embedded + sql_logo + Fit + 9.125in + 0.5in + 1.75in + 2 + + + + + + + true + true + + + + + ="Dashboard Version: " + Parameters!version_string.Value + + + + + + + 7.75in + 0.25in + 3.125in + 1 + + + + + + + + + + true + true + + + + + =First(Fields!query_text.Value, "QUERY_TEXT") + + + + + + + + + true + true + + + + + =Parameters!plan_handle.Value + + + + + + + textbox11 + 1.5in + 0.25in + 7.875in + + + + true + true + + + + + =Parameters!sql_handle.Value + + + + + + + textbox12 + 0.25in + 1.5in + 0.25in + 7.875in + 1 + + + + true + true + + + + + =Parameters!stmt_start_offset.Value + + + + + + + textbox13 + 0.5in + 1.5in + 0.25in + 2.875in + 2 + + + + true + true + + + + + =Parameters!stmt_end_offset.Value + + + + + + + textbox14 + 0.75in + 1.5in + 0.25in + 2.875in + 3 + + + + true + true + + + + + plan_handle + + + + + + + true + true + + + + + sql_handle + + + + + + + true + true + + + + + stmt_start_offset + + + + + + + true + true + + + + + stmt_end_offset + + + + + + + ContentsOnly + 2.5in + 0.2in + 1in + 9.375in + 2 + + true + view_report_params + + + + + + + + + + + 9.575in + + + + + 1.625in + + + + + + + + + true + true + + + + + Object Name: + + + + + + + true + true + + + + + Index Impact: + + + + + + + true + true + + + + + =Fields!index_impact.Value + + + + + + + index_impact + 7.375in + 0.25in + 1.875in + 2 + + + + true + true + + + + + =Fields!target_object_name.Value + + + + + + + target_object_name_1 + 1.625in + 0.25in + 4.5in + 3 + + + + true + true + + + + + Proposed Index Definition: + + + + + + + true + true + + + + + ="CREATE INDEX missing_index_" & RowNumber("MISSING_INDEXES") & " ON " & Fields!target_object_name.Value & " (" & Fields!equality_columns.Value & IIf(Len(Fields!equality_columns.Value) > 0 And Len(Fields!inequality_columns.Value) > 0, ", ", "") & Fields!inequality_columns.Value & ")" & IIf(Len(Fields!included_columns.Value) > 0, " INCLUDE (" & Fields!included_columns.Value & ")", "") + + + + + + + textbox28 + 1in + 1.625in + 0.25in + 7.625in + 5 + + + + true + true + + + + + =Fields!equality_columns.Value + + + + + + + equality_columns + 0.25in + 1.625in + 0.25in + 4.5in + 6 + + + + true + true + + + + + =Fields!inequality_columns.Value + + + + + + + inequality_columns + 0.5in + 1.625in + 0.25in + 4.5in + 7 + + + + true + true + + + + + =Fields!included_columns.Value + + + + + + + included_columns + 0.75in + 1.625in + 0.25in + 4.5in + 8 + + + + true + true + + + + + Equality Columns: + + + + + + + true + true + + + + + Inequality Columns: + + + + + + + true + true + + + + + Included Columns: + + + + + + + ContentsOnly + 1.375in + 9.375in + + 2pt + + + + + true + + + + + + + true + true + + + + + ="Report Local Time: " & Globals!ExecutionTime + + + + + + + 0.4in + 0.2in + 0.25in + 2.5in + 1 + + + + Embedded + sql_logo + Fit + 9.2in + 0.5in + 1.75in + 2 + + + + + + + true + true + + + + + ="Dashboard Version: " + Parameters!version_string.Value + + + + + + + 7.8in + 0.25in + 3.125in + 1 + + + + + + + + + + textbox6 + 19 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!avg_user_impact.Value+Fields!avg_system_impact.Value + + true + + + + + Overall Impact + + + + + + + textbox12 + 18 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 2 + + + + + + + true + + =Fields!database_id.Value + + true + + + + + Database ID + + + + + + + textbox21 + 17 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!object_id.Value + + true + + + + + Object ID + + + + + + + textbox16 + 16 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!unique_compiles.Value + + true + + + + + Unique Compiles + + + + + + + textbox2 + 15 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!user_seeks.Value + + true + + + + + User Seeks + + + + + + + textbox3 + 14 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!user_scans.Value + + true + + + + + User Scans + + + + + + + textbox19 + 13 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!avg_total_user_cost.Value + + true + + + + + Avg Total User Cost + + + + + + + textbox13 + 12 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!avg_user_impact.Value + + true + + + + + Avg User Impact + + + + + + + textbox8 + 11 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Proposed Index + + + + + + + 10 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + =Fields!index_handle.Value + + + + + + + index_handle + 9 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!avg_user_impact.Value + Fields!avg_system_impact.Value + + + + + + + textbox15 + 8 + + + 2pt + 2pt + 2pt + 2pt + + + 2 + + + + + + + true + true + + + + + =Fields!database_id.Value + + + + + + + database_id + 7 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!object_id.Value + + + + + + + object_id + 6 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!unique_compiles.Value + + + + + + + unique_compiles + 5 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!user_seeks.Value + + + + + + + user_seeks + 4 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!user_scans.Value + + + + + + + user_scans + 3 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!avg_total_user_cost.Value, 2) + + + + + + + avg_total_user_cost + 2 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!avg_user_impact.Value) + + + + + + + avg_user_impact + 1 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + ="CREATE INDEX missing_index_" & Fields!index_handle.Value & " ON " & Fields!fully_qualified_object.Value & " (" & Fields!equality_columns.Value & IIf(Len(Fields!equality_columns.Value) > 0 And Len(Fields!inequality_columns.Value) > 0, ", ", "") & Fields!inequality_columns.Value & ")" & IIf(Len(Fields!included_columns.Value) > 0, " INCLUDE (" & Fields!included_columns.Value & ")", "") + + + + + + + textbox28 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + true + After + true + + + + Detail + + + + =Fields!avg_user_impact.Value + Descending + + + + + + Detail_Collection + Output + true + + + + SQL Server has not identified any missing indexes matching the specified criteria. + MISSING_INDEX_STATS + 0.625in + 0.125in + 0.4in + 15.625in + + + + + + + true + true + + + + + Object ID + + + + + + + true + true + + + + + =IIf(Parameters!DatabaseID.Value is Nothing, "All", Parameters!DatabaseID.Value) + + + + + + + textbox7 + 1.125in + 0.25in + 1.875in + 2 + + + + true + true + + + + + =IIf(Parameters!ObjectID.Value is Nothing, "All", Parameters!ObjectID.Value) + + + + + + + textbox11 + 0.25in + 1.125in + 0.25in + 1.875in + 3 + + + + ContentsOnly + 1.5in + 0.125in + 0.5in + 5.5in + 1 + + true + report_params + + + + + + + + true + true + + + + + This report shows potential indexes that the SQL Server optimizer identified during query compilation. These recommendations are specific recommendations targeting a specific query. Consider submitting your workload and the proposed index to the Database Tuning Advisor for a more comprehensive evaluation that could include partitioning, choice of clustered versus nonclustered index, and so forth. + + + + + + + 2in + + + + + + + 0.375in + 0.125in + 0.25in + 2.375in + + + + true + true + + + + + Missing Index Report + + + + + + + Embedded + sql_logo + Fit + 9.25in + 0.5in + 1.75in + 2 + + + + + + + true + true + + + + + ="Dashboard Version: " + Parameters!version_string.Value + + + + + + + 7.875in + 0.25in + 3.125in + 1 + + + + + + + + + + textbox2 + 19 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Value + + + + + + + textbox3 + 18 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + Database ID + + + + + + + textbox5 + 17 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!database_id.Value + + + + + + + database_id + 16 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + Database Name + + + + + + + textbox4 + 15 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!database_name.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + File ID + + + + + + + textbox6 + 13 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!file_id.Value + + + + + + + file_id + 12 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + Page Number + + + + + + + textbox8 + 11 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!page_no.Value + + + + + + + page_no + 10 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + Page Type + + + + + + + textbox7 + 9 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!page_type.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + Object ID + + + + + + + textbox12 + 7 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!object_id.Value + + + + + + + object_id + 6 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + Object Name + + + + + + + textbox15 + 5 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!object_name.Value + + + + + + + object_name + 4 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + Index ID + + + + + + + textbox10 + 3 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!index_id.Value + + + + + + + index_id + 2 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + Level + + + + + + + textbox18 + 1 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!page_level.Value + + + + + + + page_level + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + After + true + + + + Detail + + + + + + =IIf(Fields!database_name.Value is Nothing, True, False) + + + + + + + + + =IIf(Fields!object_name.Value is Nothing, True, False) + + + + + + Detail_Collection + Output + true + + + + The specified Page ID is not valid or you do not have permissions to view the page. + PAGE_DETAILS + 0.125in + 0.125in + 2in + 10.375in + + + + + + true + true + + + + + wait_resource + + + + + + + true + true + + + + + =Parameters!wait_resource.Value + + + + + + + 1.75in + 0.25in + 5.875in + 1 + + + + ContentsOnly + 2.625in + 0.125in + 0.25in + 7.75in + 1 + + true + view_report_params + + + + + + + + 2.875in + + + + + + + true + true + + + + + ="Report Local Time: " & Globals!ExecutionTime + + + + + + + 0.375in + 0.125in + 0.25in + 2.25in + 1 + + + + Embedded + sql_logo + Fit + 9.125in + 0.5in + 1.75in + 2 + + + + + + + true + true + + + + + ="Dashboard Version: " + Parameters!version_string.Value + + + + + + + 7.75in + 0.25in + 3.125in + 1 + + + + + + + + + + ContentsOnly + 0.65in + 0.1in + 0.375in + 4.7in + + =IIf(avg(Fields!SystemIdle.Value, "CPU_UTILIZATION_HISTORY") < 20 or avg(Fields!SQLProcessUtilization.Value, "CPU_UTILIZATION_HISTORY") > 75 * (Sum(Fields!number_of_schedulers.Value, "MISC_INFO")/Sum(Fields!number_of_cpus.Value, "MISC_INFO")) or max(Fields!SQLProcessUtilization.Value, "CPU_UTILIZATION_HISTORY") > 90 * (Sum(Fields!number_of_schedulers.Value, "MISC_INFO")/Sum(Fields!number_of_cpus.Value, "MISC_INFO")), false, true) + + + + 6pt + + + 6pt + + 0.75pt + + T + + + End Time + + + False + 1 + + False + + 0.75pt + + + NaN + + + False + + 0.75pt + + + NaN + -1 + + + True + + 0.75pt + + + NaN + + + None + + NaN + NaN + true + true + false + + + + + + + NaN + Opposite + NaN + NaN + + + 0.75pt + + + + % CPU + + + True + + True + + 0.75pt + + + NaN + + + False + + 0.75pt + + + NaN + + + True + + 0.75pt + + + NaN + + + None + + true + 0 + 100 + true + true + false + + + + + + + NaN + Opposite + NaN + NaN + + + 0.75pt + + LightGrey + + + + + + + 0.75pt + + Tahoma + 8pt + + Column + + + + + true + + + + + System CPU Utilization + + + + + + + + There is no CPU utilization history available yet; SQL Server may have just been started. Wait at least 60 seconds and refresh the report. + + + CPU_UTILIZATION_HISTORY + 1.03889in + 0.1in + 3.475in + 4.7in + 1 + + + __Upgraded2005__ + __Upgraded2005__ + + + + + + + + + + true + true + + + + + =Sum(Fields!missing_index_count.Value, "MISC_INFO") + + + + + + + missing_index_count + 0.05in + 1.875in + 0.2in + 1in + + + + true + true + + + + + Missing Indexes + + + + + + 2pt + 2pt + 2pt + 2pt + + + + ContentsOnly + 1.25278in + 0.3in + 3.875in + + =IIf(Sum(Fields!missing_index_count.Value, "MISC_INFO") = 0, true, false) + + + + + + + + number_of_databases + 0.8in + 1.875in + 0.2in + 1in + 1 + + + + true + true + + + + + Databases + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + Active Traces + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + =Sum(Fields!running_traces.Value, "MISC_INFO") + + + + + + + running_traces + 0.3in + 1.875in + 0.2in + 1in + 4 + + + + true + true + + + + + Miscellaneous Information + + + + + + + true + true + + + + + =Sum(Fields!number_of_xevent_sessions.Value, "MISC_INFO") + + + + + + + 0.55in + 1.875in + 0.2in + 1in + 6 + + + + true + true + + + + + Active Xevent Sessions + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + Database Storage Report + + + + + + 2pt + 2pt + 2pt + 2pt + + + + ContentsOnly + 6.1in + 5.5in + 1.65833in + 4in + 2 + + + + + + + + + + + =Fields!wait_category.Value + + + + + =sum(Fields!wait_time.Value) + Descending + + + + + + + + + + + + + + + + + + + =IIf(Sum(Fields!wait_time.Value) > 0, Sum(Fields!wait_time.Value), 1) + + + + + 6pt + + 0.75pt + + + + Wait Category + + + False + 1 + + False + + 0.75pt + + + NaN + + + False + + 0.75pt + + + NaN + -1 + + + True + + 0.75pt + + + NaN + + + None + + NaN + NaN + true + true + false + + + + + + + NaN + Opposite + NaN + NaN + + + 0.75pt + + + + Wait Time (ms) + + + False + + True + + 0.75pt + + + NaN + + + False + + 0.75pt + + + NaN + + + True + + 0.75pt + + + NaN + + + None + + true + 0 + true + true + false + + + + + + + NaN + Opposite + NaN + NaN + + + 0.75pt + + LightGrey + + + + + + true + + 0.75pt + + + BottomCenter + Row + + + + + true + + + + + Current Waiting Requests + + + + + + + + There are currently no user requests waiting for a resource. + + + REQUEST_WAIT_STATS + 1.025in + 5.5in + 3.475in + 4.7in + 3 + + + __Upgraded2005__ + __Upgraded2005__ + + + + + + + + true + true + + + + + Current Activity + + + + + + + + + + 1.2in + + + 1.33333in + + + 1.33333in + + + + + 0.2in + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + User Requests + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + User Sessions + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + Count + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!num_requests.Value + + + + + + + textbox26 + 13 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =First(Fields!num_sessions.Value, "SESSION_CPU_WAIT_INFO") + + + + + + + textbox31 + 12 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + Elapsed Time (ms) + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!total_elapsed_time.Value + + + + + + + total_elapsed_time + 10 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =First(Fields!total_elapsed_time.Value, "SESSION_CPU_WAIT_INFO") + + + + + + + total_elapsed_time_1 + 9 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + CPU Time (ms) + + + + + + 8pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!cpu_time.Value & " (" & FormatPercent(IIF(Fields!total_elapsed_time.Value > 0, Fields!cpu_time.Value / Fields!total_elapsed_time.Value, 0), 2) & ")" + + + + + + + textbox38 + 7 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =First(Fields!cpu_time.Value, "SESSION_CPU_WAIT_INFO") & " (" & FormatPercent(sum(Fields!cpu_time.Value, "SESSION_CPU_WAIT_INFO")/sum(Fields!total_elapsed_time.Value, "SESSION_CPU_WAIT_INFO"), 2) & ")" + + + + + + + textbox40 + 6 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + Wait Time (ms) + + + + + + 8pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_time.Value & " (" & FormatPercent(IIF(Fields!total_elapsed_time.Value > 0, Fields!wait_time.Value / Fields!total_elapsed_time.Value, 0), 2) & ")" + + + + + + + textbox35 + 4 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =First(Fields!wait_time.Value, "SESSION_CPU_WAIT_INFO") & " (" & FormatPercent(sum(Fields!wait_time.Value, "SESSION_CPU_WAIT_INFO")/sum(Fields!total_elapsed_time.Value, "SESSION_CPU_WAIT_INFO"), 2) & ")" + + + + + + + textbox36 + 3 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + Cache Hit Ratio + + + + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatPercent(Fields!cache_hit_ratio.Value, 3) + + + + + + + cache_hit_ratio + + + + + wait_buffer_io + + + =Parameters!Server.Value + + + =Parameters!version_string.Value + + + + + + + 1 + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatPercent(First(Fields!cache_hit_ratio.Value, "SESSION_CPU_WAIT_INFO"),3) + + + + + + + cache_hit_ratio_1 + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + After + true + + + + Detail + + + + + + + + + Detail_Collection + Output + true + + + + REQUEST_CPU_WAIT_INFO + 0.2in + 1.2in + 3.86666in + 1 + + + + + + + + true + true + + + + + System performance may be degraded because of excessive waits happening on the server. Click on a Wait Category data point in the chart below to investigate further. + + + + + + + Embedded + warning2 + image/jpeg + 0.33333in + 0.33333in + 1 + + + + + + + + + true + true + + + + + Waits + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + Historical Information + + + + + + + true + true + + + + + Expensive Queries + + + + + + + true + true + + + + + By Logical Reads + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + By Physical Reads + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + By CPU + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + By Duration + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + By Logical Writes + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + By CLR Time + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + IO Statistics + + + + + + 2pt + 2pt + 2pt + 2pt + + + + ContentsOnly + 4.6in + 5.5in + 1.4in + 4in + 7 + + + + + + + + true + true + true + + + + + ="NOTE: This SQL Server instance is limited to using only " & Sum(Fields!number_of_schedulers.Value, "MISC_INFO") & " out of " & Sum(Fields!number_of_cpus.Value, "MISC_INFO") & " CPUs. The maximum potential SQL CPU consumption is " & FormatPercent(Sum(Fields!number_of_schedulers.Value, "MISC_INFO")/Sum(Fields!number_of_cpus.Value, "MISC_INFO"), 0) & "." + + + + + + + ContentsOnly + 4.5in + 0.1in + 0.5in + 4.7in + 8 + + =IIf(Sum(Fields!number_of_schedulers.Value, "MISC_INFO") <> Sum(Fields!number_of_cpus.Value, "MISC_INFO"), False, true) + + + + + + + + Embedded + warning2 + image/jpeg + 0.33333in + 0.33333in + 1 + + + + + + + textbox2 + 0.5in + 0.1in + 0.25in + 2.8in + 1 + + + + true + true + + + + + Microsoft SQL Server Performance Dashboard Reports + + + + + + + textbox10 + 0.1in + 0.1in + 0.4in + 6.2in + 2 + + + + + + + + + + true + true + + + + + ="Dashboard Version: " + Parameters!version_string.Value + + + + + + + 0.01389in + 7.825in + 0.25in + 3.125in + 1 + + + + + + + + + + true + true + + + + + Plan Guide Name + + + + + + + true + true + + + + + Plan Guide ID + + + + + + + true + true + + + + + Query Hints + + + + + + + true + true + + + + + =Fields!hints.Value + + + + + + + textbox5 + 1in + 1.5in + 0.2in + 6.25in + 4 + + + + true + true + + + + + Created + + + + + + + true + true + + + + + Last Modified + + + + + + + true + true + + + + + =Fields!modify_date.Value + + + + + + + 0.8in + 1.5in + 0.2in + 6.25in + 7 + + + + true + true + + + + + =Fields!create_date.Value + + + + + + + 0.6in + 1.5in + 0.2in + 6.25in + 8 + + + + true + true + + + + + =Fields!plan_guide_id.Value + + + + + + + 0.4in + 1.5in + 0.2in + 6.25in + 9 + + + + true + true + + + + + =Fields!name.Value + + + + + + + 0.2in + 1.5in + 0.2in + 6.25in + 10 + + + + true + true + + + + + =Parameters!database_name.Value + + + + + + + 1.5in + 0.2in + 6.25in + 11 + + + + true + + + + + + + true + true + + + + + =Parameters!database_name.Value + + + + + + + 1.75in + 0.25in + 6in + 1 + + + + true + true + + + + + plan_guide_name + + + + + + + true + true + + + + + =Parameters!plan_guide_name.Value + + + + + + + 0.25in + 1.75in + 0.25in + 6in + 3 + + + + ContentsOnly + 1.85in + 0.2in + 0.5in + 7.875in + 1 + + true + view_report_params + + + + + + + + 2.35in + + + + + + + true + true + + + + + ="Report Local Time: " & Globals!ExecutionTime + + + + + + + 0.5in + 0.2in + 0.25in + 2.5in + 1 + + + + Embedded + sql_logo + Fit + 9.2in + 0.5in + 1.75in + 2 + + + + + + + true + true + + + + + ="Dashboard Version: " + Parameters!version_string.Value + + + + + + + 7.8in + 0.25in + 3.125in + 1 + + + + + + + + + + true + true + + + + + =IIf(First(Fields!database_name.Value, "QUERY_ATTRIBUTES") is Nothing, First(Fields!database_id.Value, "QUERY_ATTRIBUTES"), First(Fields!database_name.Value, "QUERY_ATTRIBUTES")) + + + + + + + 1.1in + 0.2in + 6.6in + 1 + + + + ContentsOnly + 0.125in + 0.1in + 0.2in + 7.8in + + =IIf(First(Fields!database_name.Value, "QUERY_ATTRIBUTES") is Nothing and First(Fields!database_id.Value, "QUERY_ATTRIBUTES") is Nothing, true, false) + + + + + + + + true + true + + + + + =IIf(First(Fields!query_text.Value, "QUERY_ATTRIBUTES") <> "", First(Fields!query_text.Value, "QUERY_ATTRIBUTES"), "Not available") + + + + + + + + + true + true + + + + + ="SQL Server has identified " & First(Fields!missing_index_count.Value, "SHOWPLAN_ATTRIBUTES") & " missing index" & IIf(Sum(Fields!missing_index_count.Value, "SHOWPLAN_ATTRIBUTES") > 1, "es", "") & " that would benefit this query." + + + + + + + Embedded + warning2 + image/jpeg + 0.33333in + 0.33333in + 1 + + + + + + 2pt + 2pt + 2pt + 2pt + + + + ContentsOnly + 1in + 0.1in + 0.4in + 10.8in + 3 + + =IIf(Sum(Fields!missing_index_count.Value, "SHOWPLAN_ATTRIBUTES") > 0, false, true) + + + + + + + + true + true + + + + + =First(Fields!plan_guide_name.Value, "SHOWPLAN_ATTRIBUTES") + + + + + + 2pt + 2pt + 2pt + 2pt + + + + ContentsOnly + 0.7in + 0.1in + 0.2in + 7.8in + 4 + + =IIf(First(Fields!plan_guide_name.Value, "SHOWPLAN_ATTRIBUTES") <> "", false, true) + + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Estimated Rows + + + + + + + textbox23 + 24 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Estimated IO + + + + + + + textbox29 + 23 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Estimated CPU + + + + + + + textbox27 + 22 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Estimated Subtree Cost + + + + + + + textbox21 + 21 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Estimated Rewinds + + + + + + + textbox28 + 20 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Estimated Rebinds + + + + + + + textbox22 + 19 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Statement Text + + + + + + + textbox19 + 18 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg Row Size + + + + + + + textbox20 + 17 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Physical Operator + + + + + + + textbox9 + 16 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Logical Operator + + + + + + + textbox18 + 15 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Node ID + + + + + + + textbox8 + 14 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Parent Node ID + + + + + + + textbox7 + 13 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + =Fields!warnings.Value + + + + + + =IIf(Fields!warnings.Value is nothing, "Transparent", "Yellow") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!est_rows.Value + + + + + + + est_rows + 11 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!est_io.Value + + + + + + + est_io + 10 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!est_cpu.Value + + + + + + + est_cpu + 9 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!est_subtree_cost.Value + + + + + + + est_subtree_cost + 8 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!est_rewinds.Value + + + + + + + est_rewinds + 7 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!est_rebinds.Value + + + + + + + est_rebinds + 6 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!stmt_text.Value + + + + + + =Str(2 + (Level("table2_Group1") * 20)) & "pt" + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!avg_row_size.Value + + + + + + + avg_row_size + 4 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!physical_op.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!logical_op.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!node_id.Value + + + + + + + node_id + 1 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!parent_node_id.Value + + + + + + + parent_node_id + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + =IIf(CBool(First(Fields!warnings_exist.Value, "SHOWPLAN_ATTRIBUTES")) = false, true, false) + + + + + + + + + + + + + + + + + + + + true + After + true + + + + + =Fields!node_id.Value + + =Fields!parent_node_id.Value + + + + + Detail + + + + + Detail_Collection + Output + true + + + + + + =IIf(First(Fields!query_plan.Value, "SHOWPLAN_ATTRIBUTES") is Nothing, "There is no plan that matches the specified plan_handle; the plan may have already aged out of the cache.", "The XML showplan was too complex to convert to the tabular format required by this report. You may view the graphical showplan by doing the following:" & ChrW(13) & ChrW(10) & +"1. Export the report to Excel" & ChrW(13) & ChrW(10) & +"2. Copy the text from the View Showplan XML region to a new text file (Notepad) and save with a .sqlplan extension" & ChrW(13) & ChrW(10) & +"3. Open the .sqlplan file in Management Studio." & ChrW(13) & ChrW(10)) + QUERY_PLAN_SHREDDED + 2.4in + 0.1in + 0.6in + 21in + 5 + + + + + + + true + true + + + + + =Parameters!plan_handle.Value + + + + + + + textbox10 + 1.75in + 0.25in + 6.05in + 1 + + + + true + true + + + + + sql_handle + + + + + + + true + true + + + + + =Parameters!sql_handle.Value + + + + + + + textbox12 + 0.25in + 1.75in + 0.25in + 6.05in + 3 + + + + true + true + + + + + stmt_start_offset + + + + + + + true + true + + + + + =Parameters!stmt_start_offset.Value + + + + + + + textbox3 + 0.5in + 1.75in + 0.25in + 6.05in + 5 + + + + true + true + + + + + stmt_end_offset + + + + + + + true + true + + + + + =Parameters!stmt_end_offset.Value + + + + + + + textbox30 + 0.75in + 1.75in + 0.25in + 6.05in + 7 + + + + ContentsOnly + 3.9in + 0.1in + 1in + 7.9in + 6 + + true + view_report_params + + + + + + + + + + true + true + + + + + =IIf(First(Fields!qualified_object_name.Value, "QUERY_ATTRIBUTES") is nothing, "Object ID", "Object Name") + + + + + + + true + true + + + + + =IIf(First(Fields!qualified_object_name.Value, "QUERY_ATTRIBUTES") is Nothing, First(Fields!object_id.Value, "QUERY_ATTRIBUTES"), First(Fields!qualified_object_name.Value, "QUERY_ATTRIBUTES")) + + + + + + + 1.1in + 0.2in + 6.6in + 1 + + + + ContentsOnly + 0.3in + 0.1in + 0.2in + 7.8in + 8 + + =IIf(First(Fields!qualified_object_name.Value, "QUERY_ATTRIBUTES") is Nothing and First(Fields!object_id.Value, "QUERY_ATTRIBUTES") is Nothing, true, false) + + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Value at Compile Time + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + =Fields!param_name.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!param_compiled_value.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + true + After + true + + + + Detail + + + + + Detail_Collection + Output + true + + + + PLAN_PARAMETERS + 0.2in + 0.4in + 7.7in + + + + + + + ContentsOnly + 1.5in + 0.1in + 0.6in + 7.8in + 9 + + =IIf(Count(Fields!param_name.Value, "PLAN_PARAMETERS") = 0, true, false) + + + + + + + + true + true + + + + + =First(Fields!query_plan.Value, "SHOWPLAN_ATTRIBUTES") + + + + + + + ContentsOnly + 3.2in + 0.1in + 0.4in + 10.6in + 10 + + + + + + + 4.9in + + + + + + + true + true + + + + + ="Report Local Time: " & Globals!ExecutionTime + + + + + + + 0.4in + 0.1in + 0.25in + 3in + 1 + + + + Embedded + sql_logo + Fit + 9.2in + 0.5in + 1.75in + 2 + + + + + + + true + true + + + + + ="Dashboard Version: " + Parameters!version_string.Value + + + + + + + 7.7in + 0.25in + 3.125in + 1 + + + + + + + + + + + + + 0.625in + + + 6.125in + + + 0.875in + + + 0.875in + + + 0.875in + + + 0.875in + + + 1in + + + 1.25in + + + 1in + + + 1in + + + 1in + + + 1.25in + + + 1in + + + 1in + + + 1in + + + 1.25in + + + 1in + + + 1in + + + 1in + + + 1.25in + + + 1in + + + 1in + + + 1in + + + 1.25in + + + 1in + + + 1in + + + 1in + + + 1.25in + + + 1in + + + 1in + + + 1in + + + + + 0.375in + + + + + true + true + + + + + Query Number + + + + + + + textbox1 + 74 + + + + Gainsboro + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Representative Query + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Total Executes + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Cached Query Count + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!queryplanhashcount.Value + + true + + + + + Unique Plan Count + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Highest Plan Generation + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Earliest Plan Cached + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =IIf(Parameters!OrderBy_Criteria.Value = "CPU", true, false) + + true + + + + + Cumulative CPU (ms) + + + + + + + 67 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 4 + + + + + + + + + true + + =IIf(Parameters!OrderBy_Criteria.Value = "Duration", true, false) + + true + + + + + Cumulative Duration (ms) + + + + + + + 66 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 4 + + + + + + + + + true + + =IIf(Parameters!OrderBy_Criteria.Value = "Physical Reads", true, false) + + true + + + + + Cumulative Physical Reads + + + + + + + 65 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 4 + + + + + + + + + true + + =IIf(Parameters!OrderBy_Criteria.Value = "Logical Reads", true, false) + + true + + + + + Cumulative Logical Reads + + + + + + + 64 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 4 + + + + + + + + + true + + =IIf(Parameters!OrderBy_Criteria.Value = "Logical Writes", true, false) + + true + + + + + Cumulative Logical Writes + + + + + + + 63 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 4 + + + + + + + + + true + + =IIf(Parameters!OrderBy_Criteria.Value = "CLR Time", true, false) + + true + + + + + Cumulative CLR Time (ms) + + + + + + + 62 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 4 + + + + + + + + + 0.25in + + + + + true + true + + + + + + + + + + + + Gainsboro + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Total + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Max + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Min + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Total + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Max + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Min + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Total + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Max + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Min + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Total + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Max + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Min + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Total + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Max + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Min + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Total + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Max + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Min + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.25in + + + + + true + true + + + + + =Fields!query_rank.Value + + + + + + + query_rank + 30 + + + + + + + + true + true + + + + + =Fields!query_text.Value + + + + + + + White + 0.8pt + + + Black + 0.8pt + + + Black + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + true + + + + + + true + true + + + + + =FormatNumber(Fields!execution_count.Value,0) + + + + + + + + + + + true + true + + + + + =Fields!querycount.Value + + + + + + + + + + + true + true + + + + + =Fields!queryplanhashcount.Value + + + + + + + + + + + true + true + + + + + =Fields!max_plan_generation_num.Value + + + + + + + + + + + true + true + + + + + =Fields!earliest_creation_time.Value + + + + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_CPU_time.Value/1000,3) + + + + + + + 23 + + + + + + + + true + true + + + + + =FormatNumber(Fields!max_CPU_time.Value/1000, 3) + + + + + + + 22 + + + + + + + + true + true + + + + + =FormatNumber(Fields!average_CPU_time.Value/1000,3) + + + + + + + 21 + + + + + + + + true + true + + + + + =FormatNumber(Fields!min_CPU_time.Value/1000,3) + + + + + + + 20 + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_elapsed_time.Value/1000, 3) + + + + + + + 19 + + + + + + + + true + true + + + + + =FormatNumber(Fields!max_elapsed_time.Value/1000, 3) + + + + + + + 18 + + + + + + + + true + true + + + + + =FormatNumber(Fields!average_elapsed_time.Value/1000, 3) + + + + + + + 17 + + + + + + + + true + true + + + + + =FormatNumber(Fields!min_elapsed_time.Value/1000, 3) + + + + + + + 16 + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_physical_reads.Value,0) + + + + + + + 15 + + + + + + + + true + true + + + + + =FormatNumber(Fields!max_physical_reads.Value,0) + + + + + + + 14 + + + + + + + + true + true + + + + + =FormatNumber(Fields!average_physical_reads.Value,0) + + + + + + + 13 + + + + + + + + true + true + + + + + =FormatNumber(Fields!min_physical_reads.Value,0) + + + + + + + 12 + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_logical_reads.Value,0) + + + + + + + 11 + + + + + + + + true + true + + + + + =FormatNumber(Fields!max_logical_reads.Value,0) + + + + + + + 10 + + + + + + + + true + true + + + + + =FormatNumber(Fields!average_logical_reads.Value,0) + + + + + + + 9 + + + + + + + + true + true + + + + + =FormatNumber(Fields!min_logical_reads.Value,0) + + + + + + + 8 + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_logical_writes.Value,0) + + + + + + + 7 + + + + + + + + true + true + + + + + =FormatNumber(Fields!max_logical_writes.Value,0) + + + + + + + 6 + + + + + + + + true + true + + + + + =FormatNumber(Fields!average_logical_writes.Value,0) + + + + + + + 5 + + + + + + + + true + true + + + + + =FormatNumber(Fields!min_logical_writes.Value,0) + + + + + + + 4 + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_clr_time.Value/1000, 3) + + + + + + + 3 + + + + + + + + true + true + + + + + =FormatNumber(Fields!max_clr_time.Value/1000, 3) + + + + + + + 2 + + + + + + + + true + true + + + + + =FormatNumber(Fields!average_clr_time.Value/1000, 3) + + + + + + + 1 + + + + + + + + true + true + + + + + =FormatNumber(Fields!min_clr_time.Value/1000, 3) + + + + + + + + + + + + + + + + + + + + + + + + + + + =IIf(Parameters!OrderBy_Criteria.Value = "CPU", false, true) + CumulativeCPU_Header + + + + + =IIf(Parameters!OrderBy_Criteria.Value = "CPU", false, true) + CumulativeCPU_Header + + + + + =IIf(Parameters!OrderBy_Criteria.Value = "CPU", false, true) + CumulativeCPU_Header + + + + + + =IIf(Parameters!OrderBy_Criteria.Value = "Duration", false, true) + CumulativeDuration_Header + + + + + =IIf(Parameters!OrderBy_Criteria.Value = "Duration", false, true) + CumulativeDuration_Header + + + + + =IIf(Parameters!OrderBy_Criteria.Value = "Duration", false, true) + CumulativeDuration_Header + + + + + + =IIf(Parameters!OrderBy_Criteria.Value = "Physical Reads", false, true) + CumulativePhysicalReads_Header + + + + + =IIf(Parameters!OrderBy_Criteria.Value = "Physical Reads", false, true) + CumulativePhysicalReads_Header + + + + + =IIf(Parameters!OrderBy_Criteria.Value = "Physical Reads", false, true) + CumulativePhysicalReads_Header + + + + + + =IIf(Parameters!OrderBy_Criteria.Value = "Logical Reads", false, true) + CumulativeLogicalReads_Header + + + + + =IIf(Parameters!OrderBy_Criteria.Value = "Logical Reads", false, true) + CumulativeLogicalReads_Header + + + + + =IIf(Parameters!OrderBy_Criteria.Value = "Logical Reads", false, true) + CumulativeLogicalReads_Header + + + + + + =IIf(Parameters!OrderBy_Criteria.Value = "Logical Writes", false, true) + CumulativeLogicalWrites_Header + + + + + =IIf(Parameters!OrderBy_Criteria.Value = "Logical Writes", false, true) + CumulativeLogicalWrites_Header + + + + + =IIf(Parameters!OrderBy_Criteria.Value = "Logical Writes", false, true) + CumulativeLogicalWrites_Header + + + + + + =IIf(Parameters!OrderBy_Criteria.Value = "CLR Time", false, true) + CumulativeCLRTime_Header + + + + + =IIf(Parameters!OrderBy_Criteria.Value = "CLR Time", false, true) + CumulativeCLRTime_Header + + + + + =IIf(Parameters!OrderBy_Criteria.Value = "CLR Time", false, true) + CumulativeCLRTime_Header + + + + + + + + true + After + true + + + true + After + true + + + + Detail + + + + + Detail_Collection + Output + true + + + + There are no cached queries matching the specified criteria. + QUERY_STATS_TOP_N1 + 5in + 0.125in + 0.875in + 36.75in + 1 + + =IIf(Count(Fields!query_rank.Value, "QUERY_STATS_TOP_N1") > 0, false, true) + + bmk_high_cpu_query_table + NoOutput + + + + + + + + + + + =Fields!query_rank.Value + + + + + =Fields!query_rank.Value + + + + Output + + + + + + + + + + + + + + + + + =Fields!charted_value.Value + + + + + 6pt + + 0.75pt + + + + Query Number + + + False + 1 + + False + + 0.75pt + + + NaN + + + False + + 0.75pt + + + NaN + -1 + + + True + + 0.75pt + + + NaN + + + None + + NaN + NaN + true + true + false + + + + + + + NaN + Opposite + NaN + NaN + + + 0.75pt + + + + =Switch(Parameters!OrderBy_Criteria.Value = "CPU", "CPU (ms)", Parameters!OrderBy_Criteria.Value = "CLR Time", "CLR Time (ms)", Parameters!OrderBy_Criteria.Value = "Duration", "Duration (ms)", true, Parameters!OrderBy_Criteria.Value) + + + True + + True + + 0.75pt + + + NaN + + + False + + 0.75pt + + + NaN + + + True + + 0.75pt + + + NaN + + + None + + true + 0 + true + true + false + + + + + + + NaN + Opposite + NaN + NaN + + + 0.75pt + + LightGrey + + + + + + true + + 0.75pt + + + RightCenter + Column + + + + + true + + + + + ="Queries with Highest " & Parameters!OrderBy_Criteria.Value + + + + + + + + No rows matched the specified criteria. + + + QUERY_STATS_TOP_N1 + 0.5in + 0.125in + 4.375in + 10.625in + 2 + + + __Upgraded2005__ + __Upgraded2005__ + + + + + + 5.875in + + + + + + + true + true + + + + + ="Report Local Time: " & Globals!ExecutionTime + + + + + + + 0.375in + 0.125in + 0.25in + 2.5in + 1 + + + + Embedded + sql_logo + Fit + 9.125in + 0.5in + 1.75in + 2 + + + + + + + true + true + + + + + ="Dashboard Version: " + Parameters!version_string.Value + + + + + + + 7.75in + 0.25in + 3.125in + 1 + + + + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!query_text.Value + + true + + + + + Query Text + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!execution_count.Value + + true + + + + + Executes + + + + + + + textbox32 + 75 + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!total_worker_time.Value + + true + + + + + CPU Time (ms) + + + + + + + 74 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 5 + + + + + + + + + + true + + =Fields!total_elapsed_time.Value + + true + + + + + Duration (ms) + + + + + + + 73 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 5 + + + + + + + + + + true + true + + + + + Wait Time (%) + + + + + + + textbox12 + 72 + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!total_logical_reads.Value + + true + + + + + Logical Reads + + + + + + + 71 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 5 + + + + + + + + + + true + + =Fields!total_physical_reads.Value + + true + + + + + Physical Reads + + + + + + + 70 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 5 + + + + + + + + + + true + + =Fields!total_logical_writes.Value + + true + + + + + Logical Writes + + + + + + + textbox4 + 69 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 5 + + + + + + + + + + true + + =Fields!total_clr_time.Value + + true + + + + + CLR Time (ms) + + + + + + + textbox28 + 68 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 5 + + + + + + + + + + 0.25in + + + + + true + true + + + + + + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + + textbox36 + 65 + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Total + + + + + + + textbox8 + 64 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Max + + + + + + + textbox9 + 63 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg + + + + + + + textbox18 + 62 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Min + + + + + + + textbox15 + 61 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Last + + + + + + + textbox22 + 60 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Total + + + + + + + 59 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Max + + + + + + + 58 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg + + + + + + + 57 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Min + + + + + + + 56 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Last + + + + + + + 55 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + + textbox13 + 54 + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Total + + + + + + + 53 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Max + + + + + + + 52 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg + + + + + + + 51 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Min + + + + + + + 50 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Last + + + + + + + 49 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Total + + + + + + + 48 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Max + + + + + + + 47 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg + + + + + + + 46 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Min + + + + + + + 45 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Last + + + + + + + 44 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Total + + + + + + + 43 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Max + + + + + + + 42 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg + + + + + + + 41 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Min + + + + + + + 40 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Last + + + + + + + 39 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Total + + + + + + + 38 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Max + + + + + + + 37 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg + + + + + + + 36 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Min + + + + + + + 35 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Last + + + + + + + 34 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + =Fields!database_name.Value + + + + + + + database_name + 33 + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!query_text.Value + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + true + + + + + + true + true + + + + + =Fields!execution_count.Value + + + + + + + execution_count + 31 + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_worker_time.Value/1000, 3) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!max_worker_time.Value/1000,3) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_worker_time.Value/1000/Fields!execution_count.Value, 3) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!min_worker_time.Value/1000, 3) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!last_worker_time.Value/1000, 3) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_elapsed_time.Value/1000,3) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!max_elapsed_time.Value/1000, 3) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_elapsed_time.Value/Fields!execution_count.Value/1000, 3) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!min_elapsed_time.Value/1000, 3) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!last_elapsed_time.Value/1000, 3) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber((Fields!total_elapsed_time.Value-Fields!total_worker_time.Value)/Fields!total_elapsed_time.Value * 100, 0) & "%" + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_logical_reads.Value, 0) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!max_logical_reads.Value, 0) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_logical_reads.Value/Fields!execution_count.Value, 0) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!min_logical_reads.Value, 0) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!last_logical_reads.Value, 0) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_logical_reads.Value,0) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!max_physical_reads.Value, 0) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_physical_reads.Value/Fields!execution_count.Value, 0) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!min_physical_reads.Value, 0) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!last_physical_reads.Value, 0) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_logical_writes.Value, 0) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!max_logical_writes.Value, 0) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_logical_writes.Value/Fields!execution_count.Value, 0) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!min_logical_writes.Value, 0) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!last_logical_writes.Value, 0) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_clr_time.Value/1000, 3) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!max_clr_time.Value/1000, 3) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_clr_time.Value/Fields!execution_count.Value/1000, 3) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!min_clr_time.Value/1000, 3) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!last_clr_time.Value/1000, 3) + + + + + + + Black + + =Iif(RowNumber(nothing) Mod 2, "White", "LightSteelBlue") + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + After + true + + + true + After + true + + + + Detail + + + + + Detail_Collection + Output + true + + + + QUERY_STATS_DETAILS + 1in + 0.125in + 0.825in + 52.375in + + + + + + true + true + + + + + There have been multiple executions of this query pattern (query hash), but all of the executions are generating the same query plan (query plan hash). This wastes CPU time to compile the query plans and memory to cache them. To improve overall SQL Server performance, consider parameterizing this query (via the application, template plan guide, or forced parameterization). Refer to Books Online for more information on parameterization. + + + + Embedded + warning + FitProportional + 0.5in + 0.5in + 1 + + =Iif(Parameters!Parameterize.Value=true, false, true) + + NoOutput + + + + + + true + true + + + + + query_hash + + + + + + + true + true + + + + + =Parameters!query_hash.Value + + + + + + + 1.75in + 0.25in + 6in + 1 + + + + ContentsOnly + 2.25in + 0.125in + 0.25in + 7.875in + 3 + + true + view_report_params + + + + + + + + 2.5in + + + + + + + true + true + + + + + ="Report Local Time: " & Globals!ExecutionTime + + + + + + + 0.375in + 0.125in + 0.25in + 2.5in + 1 + + + + Embedded + sql_logo + Fit + 9.125in + 0.5in + 1.75in + 2 + + + + + + + true + true + + + + + ="Dashboard Version: " + Parameters!version_string.Value + + + + + + + 7.75in + 0.25in + 3.125in + 1 + + + + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Query + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Executes + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Plan Generation + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Plan Cached + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Last Executed + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + true + + true + + + + + CPU (ms) + + + + + + + 65 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 4 + + + + + + + + + true + true + + + + + Duration (ms) + + + + + + + 64 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 4 + + + + + + + + + true + true + + + + + Physical Reads + + + + + + + 63 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 4 + + + + + + + + + true + true + + + + + Logical Reads + + + + + + + 62 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 4 + + + + + + + + + true + true + + + + + Logical Writes + + + + + + + 61 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 4 + + + + + + + + + true + true + + + + + CLR Time (ms) + + + + + + + 60 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 4 + + + + + + + + + 0.25in + + + + + true + true + + + + + + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + + Gainsboro + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Total + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Max + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Last + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Total + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Max + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Last + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Total + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Max + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Last + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Total + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Max + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Last + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Total + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Max + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Last + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Total + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Max + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Last + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Avg + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.25in + + + + + true + true + + + + + =Fields!query_rank.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!query_text.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + true + + + + + + true + true + + + + + =Fields!execution_count.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!plan_generation_num.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!creation_time.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!last_execution_time.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_worker_time.Value/1000,3) + + + + + + + textbox51 + 23 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!max_worker_time.Value/1000, 3) + + + + + + + textbox21 + 22 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!last_worker_time.Value/1000, 3) + + + + + + + textbox4 + 21 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_worker_time.Value/Fields!execution_count.Value / 1000, 3) + + + + + + + 20 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_elapsed_time.Value/1000, 3) + + + + + + + total_elapsed_time + 19 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!max_elapsed_time.Value/1000, 3) + + + + + + + max_elapsed_time + 18 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!last_elapsed_time.Value/1000, 3) + + + + + + + last_elapsed_time + 17 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_elapsed_time.Value/Fields!execution_count.Value/1000, 3) + + + + + + + textbox87 + 16 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!total_physical_reads.Value + + + + + + + total_physical_reads + 15 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!max_physical_reads.Value + + + + + + + max_physical_reads + 14 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!last_physical_reads.Value + + + + + + + last_physical_reads + 13 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_physical_reads.Value/Fields!execution_count.Value, 0) + + + + + + + textbox96 + 12 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!total_logical_reads.Value + + + + + + + total_logical_reads + 11 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!max_logical_reads.Value + + + + + + + max_logical_reads + 10 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!last_logical_reads.Value + + + + + + + last_logical_reads + 9 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_logical_reads.Value/Fields!execution_count.Value, 0) + + + + + + + textbox76 + 8 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!total_logical_writes.Value + + + + + + + total_logical_writes + 7 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!max_logical_writes.Value + + + + + + + max_logical_writes + 6 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!last_logical_writes.Value + + + + + + + last_logical_writes + 5 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_logical_writes.Value/Fields!execution_count.Value, 0) + + + + + + + textbox92 + 4 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_clr_time.Value/1000, 3) + + + + + + + total_clr_time + 3 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!max_clr_time.Value/1000, 3) + + + + + + + max_clr_time + 2 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!last_clr_time.Value/1000, 3) + + + + + + + last_clr_time + 1 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Fields!total_clr_time.Value/Fields!execution_count.Value/1000, 3) + + + + + + + textbox110 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + cpu_header + + + + + cpu_header + + + + + cpu_header + + + + + + true + duration_header + + + + + true + duration_header + + + + + true + duration_header + + + + + + true + physreads_header + + + + + true + physreads_header + + + + + true + physreads_header + + + + + + true + logreads_header + + + + + true + logreads_header + + + + + true + logreads_header + + + + + + true + logwrites_header + + + + + true + logwrites_header + + + + + true + logwrites_header + + + + + + true + clrtime_header + + + + + true + clrtime_header + + + + + true + clrtime_header + + + + + + + + true + After + true + + + true + After + true + + + + Detail + + + + + Detail_Collection + Output + true + + + + There are no cached queries with last execution time within the specified window. + QUERY_STATS_RECENT_ACTIVITY + 2in + 0.125in + 0.875in + 36.125in + bmk_high_cpu_query_table + + + Tahoma + 8pt + + + + + + + 1in + + + 0.80708in + + + 1.25in + + + 1.25in + + + 1.625in + + + 1.625in + + + 1.625in + + + 2.25in + + + 2.25in + + + + + 0.375in + + + + + true + + =Fields!session_id.Value + + true + + + + + Session ID + + + + + + + textbox16 + 35 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Active Requests + + + + + + + textbox56 + 34 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Estimated Recent CPU (ms) + + + + + + + 33 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Session CPU (ms) + + + + + + + textbox45 + 32 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!login_time.Value + + true + + + + + Login Time + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Last Request Start Time + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Last Request End Time + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Program Name + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Login Name + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.25in + + + + + true + true + + + + + =Fields!session_id.Value + + + + + + + + + + + session_details + + + =Parameters!Server.Value + + + =Fields!session_id.Value + + + =Parameters!version_string.Value + + + + + + + 26 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Count(Fields!request_id.Value) + + + + + + + textbox59 + 25 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Min(Fields!session_recent_cpu_est.Value, "table2_Group1") + Sum(Fields!request_recent_cpu_est.Value, "table2_Group1"), 2, true, false, true) + + + + + + + session_recent_cpu_est + 24 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatNumber(Min(Fields!session_cpu_time.Value, "table2_Group1") + Sum(Fields!request_cpu_time.Value, "table2_Group1"), 2, true, false, true) + + + + + + + session_cpu_time + 23 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =First(Fields!login_time.Value) + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =First(Fields!last_request_start_time.Value) + + + + + + + last_request_start_time + 21 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =First(Fields!last_request_end_time.Value) + + + + + + + last_request_end_time + 20 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =First(Fields!program_name.Value) + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =First(Fields!login_name.Value) + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.375in + + + + + true + true + + + + + + + + + + + + textbox34 + 17 + + + + + + + + true + true + + + + + Request ID + + + + + + + textbox44 + 16 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Estimated Recent CPU + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Request CPU (ms) + + + + + + + textbox49 + 14 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Request Start Time + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Request Status + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Command + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + + + + + + + + + + + + 0.25in + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + =Fields!request_id.Value + + + + + + + request_id + 7 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!request_recent_cpu_est.Value + + + + + + + request_recent_cpu_est + 6 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!request_cpu_time.Value + + + + + + + request_cpu_time + 5 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!request_start_time.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!request_status.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!command.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + After + true + + + + + =Fields!session_id.Value + + + + + =min(Fields!session_recent_cpu_est.Value) + Sum(Fields!request_recent_cpu_est.Value, "table2_Group1") + Descending + + + + + After + true + + + + true + session_id + + After + true + + + + Detail + + + + + true + session_id + + + + Detail_Collection + Output + true + + + + + + No existing sessions appear to have significant recent CPU utilization. + SESSION_REQUEST_ACTIVITY + 0.375in + 0.125in + 1.25in + 13.68208in + 1 + + + + true + true + + + + + This table shows sessions that may have contributed to recent SQL Server CPU utilization. This is based on CPU consumed by current requests and extrapolated CPU usage by each session over its lifetime. This does not include CPU for any sessions which have already logged out. + + + + + + + true + true + + + + + This shows the cached queries which have the highest aggregate CPU usage that are known to have been executed during this time window. + + + + + + + 2.875in + + + + + + + true + true + + + + + ="Report Local Time: " & Globals!ExecutionTime + + + + + + + 0.625in + 0.125in + 0.25in + 2.5in + 1 + + + + true + true + + + + + ="With Activity Since " & Parameters!WithActivitySince.Value + + + + + + + true + true + + + + + =IIf(Parameters!IsUserProcess.Value=0,"Hide System Sessions", "Show System Sessions") + + + + + + 2pt + 2pt + 2pt + 2pt + + + + Embedded + sql_logo + Fit + 9.125in + 0.5in + 1.75in + 4 + + + + + + + true + true + + + + + ="Dashboard Version: " + Parameters!version_string.Value + + + + + + + 7.75in + 0.25in + 3.125in + 1 + + + + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!start_time.Value + + true + + + + + Start Time + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Query Text + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!status.Value + + true + + + + + Status + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!wait_type.Value + + true + + + + + Wait Type + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!wait_time.Value + + true + + + + + Wait Time (ms) + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!wait_resource.Value + + true + + + + + Wait Resource + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!blocking_session_id.Value + + true + + + + + Blocking Session ID + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!cpu_time.Value + + true + + + + + CPU Time (ms) + + + + + + + textbox2 + 23 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!total_elapsed_time.Value + + true + + + + + Total Elapsed Time + + + + + + + textbox12 + 22 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!logical_reads.Value + + true + + + + + Logical Reads + + + + + + + textbox7 + 21 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!reads.Value + + true + + + + + Physical Reads + + + + + + + textbox9 + 20 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!writes.Value + + true + + + + + Writes + + + + + + + textbox5 + 19 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!open_transaction_count.Value + + true + + + + + Transaction Isolation Level + + + + + + + textbox15 + 18 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!granted_query_memory.Value + + true + + + + + Granted Query Memory (KB) + + + + + + + textbox18 + 17 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!executing_managed_code.Value + + true + + + + + Executing Managed Code + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + =Fields!session_id.Value & IIf(Fields!request_id.Value is Nothing, "", ":" & Fields!request_id.Value) + + + + + + 2pt + 2pt + 2pt + 2pt + + + true + + + + + + true + true + + + + + =Fields!start_time.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!query_text.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!status.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_type.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_time.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_resource.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!blocking_session_id.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!cpu_time.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!total_elapsed_time.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!logical_reads.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!reads.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!writes.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!transaction_isolation_level.Value + + + + + + + transaction_isolation_level + 2 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =8192 * Fields!granted_query_memory.Value + + + + + + + granted_query_memory + 1 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!executing_managed_code.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + After + true + + + + Detail + + + + + Detail_Collection + Output + true + + + + REQUEST_DETAILS + 0.125in + 0.125in + 0.575in + 23.75in + + + + 0.7in + + + + + + + true + true + + + + + ="Report Local Time: " & Globals!ExecutionTime + + + + + + + 0.375in + 0.125in + 0.25in + 2.75in + 1 + + + + Embedded + sql_logo + Fit + 8.25in + 0.5in + 1.75in + 2 + + + + + + + true + true + + + + + ="Dashboard Version: " + Parameters!version_string.Value + + + + + + + 4.875in + 0.25in + 3.125in + 1 + + + + + + + + + + textbox14 + 27 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Database ID + + + + + + + textbox21 + 26 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Start Time + + + + + + + textbox16 + 25 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Status + + + + + + + textbox20 + 24 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Query Text + + + + + + + textbox43 + 23 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Logical Reads + + + + + + + textbox50 + 22 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Reads + + + + + + + textbox52 + 21 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Writes + + + + + + + textbox54 + 20 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + CPU (ms) + + + + + + + textbox56 + 19 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Blocking Session ID + + + + + + + textbox45 + 18 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Wait Type + + + + + + + textbox22 + 17 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Wait Time + + + + + + + textbox24 + 16 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Wait Resource + + + + + + + textbox23 + 15 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Transaction Count + + + + + + + textbox25 + 14 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + =Fields!request_id.Value + + + + + + + request_id + 13 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!database_id.Value + + + + + + + database_id + 12 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!start_time.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!status.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!query_text.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + true + + + + + + true + true + + + + + =Fields!logical_reads.Value + + + + + + + logical_reads_1 + 8 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!reads.Value + + + + + + + reads_1 + 7 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!writes.Value + + + + + + + writes_1 + 6 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!cpu_time.Value + + + + + + + cpu_time_1 + 5 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!blocking_session_id.Value + + + + + + + blocking_session_id + + + + + =IIF(Fields!blocking_session_id.Value <> 0, "session_details", Nothing) + + + =Fields!blocking_session_id.Value + + + =Parameters!version_string.Value + + + + + + + 4 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_type.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_time.Value + + + + + + + wait_time + 2 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_resource.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!open_transaction_count.Value + + + + + + + open_transaction_count + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + After + true + + + + Detail + + + + + Detail_Collection + Output + true + + + + This session currently does not have any requests to the server. + SESSION_REQUESTS + 3.5in + 0.1in + 0.6in + 20.625in + + + + + + + 1.5in + + + 2.4in + + + + + 0.2in + + + + + true + true + + + + + Login Name + + + + + + + + + + + true + true + + + + + =Fields!login_name.Value + + + + + + + login_name_1 + 28 + + + + + + + + 0.2in + + + + + true + true + + + + + Login Time + + + + + + + + + + + true + true + + + + + =Fields!login_time.Value + + + + + + + login_time + 26 + + + + + + + + 0.2in + + + + + true + true + + + + + Host Name + + + + + + + + + + + true + true + + + + + =Fields!host_name.Value + + + + + + + host_name + 24 + + + + + + + + 0.2in + + + + + true + true + + + + + Program Name + + + + + + + + + + + true + true + + + + + =Fields!program_name.Value + + + + + + + program_name_1 + 22 + + + + + + + + 0.2in + + + + + true + true + + + + + NT User Name + + + + + + + + + + + true + true + + + + + =Fields!nt_domain.Value + "\" + Fields!nt_user_name.Value + + + + + + + nt_user_name_1 + 20 + + + + + + + + 0.2in + + + + + true + true + + + + + CPU Time + + + + + + + + + + + true + true + + + + + =Fields!cpu_time.Value + + + + + + + cpu_time + 18 + + + + + + + + 0.2in + + + + + true + true + + + + + Memory Usage + + + + + + + + + + + true + true + + + + + =Fields!memory_usage.Value + + + + + + + memory_usage + 16 + + + + + + + + 0.2in + + + + + true + true + + + + + Total Scheduled Time + + + + + + + + + + + true + true + + + + + =Fields!total_scheduled_time.Value + + + + + + + total_scheduled_time + 14 + + + + + + + + 0.2in + + + + + true + true + + + + + Total Elapsed Time + + + + + + + + + + + true + true + + + + + =Fields!total_elapsed_time.Value + + + + + + + total_elapsed_time + 12 + + + + + + + + 0.2in + + + + + true + true + + + + + Last Request Start + + + + + + + + + + + true + true + + + + + =Fields!last_request_start_time.Value + + + + + + + last_request_start_time + 10 + + + + + + + + 0.2in + + + + + true + true + + + + + Last Request End + + + + + + + + + + + true + true + + + + + =Fields!last_request_end_time.Value + + + + + + + last_request_end_time + 8 + + + + + + + + 0.2in + + + + + true + true + + + + + Reads + + + + + + + + + + + true + true + + + + + =Fields!reads.Value + + + + + + + reads + 6 + + + + + + + + 0.2in + + + + + true + true + + + + + Writes + + + + + + + + + + + true + true + + + + + =Fields!writes.Value + + + + + + + writes + 4 + + + + + + + + 0.2in + + + + + true + true + + + + + Logical Reads + + + + + + + + + + + true + true + + + + + =Fields!logical_reads.Value + + + + + + + logical_reads + 2 + + + + + + + + 0.2in + + + + + true + true + + + + + Last Error + + + + + + + + + + + true + true + + + + + =Fields!prev_error.Value + + + + + + + prev_error + + + + + + + + + + + + + + + + + + + Detail + + + + + + + + + + + + + + + + + + + Detail_Collection + Output + true + + + + There is no longer a session matching the specified session_id. + SESSION_DATA + 0.1in + 0.1in + 3in + 3.9in + 1 + + + + + + + 2in + + + 2in + + + + + 0.2in + + + + + true + true + + + + + Text Size + + + + + + + + + + + true + true + + + + + =Fields!text_size.Value + + + + + + + text_size + 28 + + + + + + + + 0.2in + + + + + true + true + + + + + Language + + + + + + + + + + + true + true + + + + + =Fields!language.Value + + + + + + + language + 26 + + + + + + + + 0.2in + + + + + true + true + + + + + Date Format + + + + + + + + + + + true + true + + + + + =Fields!date_format.Value + + + + + + + date_format + 24 + + + + + + + + 0.2in + + + + + true + true + + + + + Date First + + + + + + + + + + + true + true + + + + + =Fields!date_first.Value + + + + + + + date_first + 22 + + + + + + + + 0.2in + + + + + true + true + + + + + Quoted Identifier + + + + + + + + + + + true + true + + + + + =Fields!quoted_identifier.Value + + + + + + + quoted_identifier_1 + 20 + + + + + + + + 0.2in + + + + + true + true + + + + + Arithabort + + + + + + + + + + + true + true + + + + + =Fields!arithabort.Value + + + + + + + arithabort + 18 + + + + + + + + 0.2in + + + + + true + true + + + + + ANSI NULL Default On + + + + + + + + + + + true + true + + + + + =Fields!ansi_null_dflt_on.Value + + + + + + + ansi_null_dflt_on + 16 + + + + + + + + 0.2in + + + + + true + true + + + + + ANSI Defaults + + + + + + + + + + + true + true + + + + + =Fields!ansi_defaults.Value + + + + + + + ansi_defaults + 14 + + + + + + + + 0.2in + + + + + true + true + + + + + ANSI Warnings + + + + + + + + + + + true + true + + + + + =Fields!ansi_warnings.Value + + + + + + + ansi_warnings + 12 + + + + + + + + 0.2in + + + + + true + true + + + + + ANSI Padding + + + + + + + + + + + true + true + + + + + =Fields!ansi_padding.Value + + + + + + + ansi_padding + 10 + + + + + + + + 0.2in + + + + + true + true + + + + + ANSI Nulls + + + + + + + + + + + true + true + + + + + =Fields!ansi_nulls.Value + + + + + + + ansi_nulls + 8 + + + + + + + + 0.2in + + + + + true + true + + + + + Concat Null Yields Null + + + + + + + + + + + true + true + + + + + =Fields!concat_null_yields_null.Value + + + + + + + concat_null_yields_null + 6 + + + + + + + + 0.2in + + + + + true + true + + + + + Transaction Isolation Level + + + + + + + + + + + true + true + + + + + =Fields!transaction_isolation_level.Value + + + + + + + transaction_isolation_level + 4 + + + + + + + + 0.2in + + + + + true + true + + + + + Lock Timeout + + + + + + + + + + + true + true + + + + + =Fields!lock_timeout.Value + + + + + + + lock_timeout + 2 + + + + + + + + 0.2in + + + + + true + true + + + + + Deadlock Priority + + + + + + + + + + + true + true + + + + + =Fields!deadlock_priority.Value + + + + + + + deadlock_priority + + + + + + + + + + + + + + + + + + + Detail + + + + + + + + + + + + + + + + + + + Detail_Collection + Output + true + + + + SESSION_DATA + 0.3in + 4.7in + 3in + 4in + 2 + + + + true + true + + + + + SET options: + + + + + + + + + + + + 3.125in + + + 3.125in + + + 5.875in + + + + + 0.2in + + + + + true + true + + + + + Database Name + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Object Name + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Query Text + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + =Fields!database_name.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!object_name.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!last_query.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + =IIf(First(Fields!database_name.Value, "LAST_BATCH_FOR_IDLE_SESSION") is Nothing, true, false) + + + + + =IIf(First(Fields!object_name.Value, "LAST_BATCH_FOR_IDLE_SESSION") is Nothing, true, false) + + + + + + + + + After + true + + + + Detail + + + + + Detail_Collection + Output + true + + + + LAST_BATCH_FOR_IDLE_SESSION + 0.2in + 0.4in + 12.125in + + + + true + true + + + + + Last query executed by this session: + + + + + + + ContentsOnly + 4.3in + 0.1in + 0.6in + 12.225in + 4 + + =IIf(Count(Fields!last_query.Value, "LAST_BATCH_FOR_IDLE_SESSION") > 0, false, true) + + + + + + + + true + true + + + + + ="Report Local Time: " & Globals!ExecutionTime + + + + + + + textbox2 + 0.4in + 0.1in + 0.25in + 2.6in + 1 + + + + Embedded + sql_logo + Fit + 9.2in + 0.5in + 1.75in + 2 + + + + + + + true + true + + + + + ="Dashboard Version: " + Parameters!version_string.Value + + + + + + + 7.9in + 0.25in + 3.125in + 1 + + + + + + + + + + textbox1 + 29 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!status.Value + + true + + + + + Status + + + + + + + textbox7 + 28 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!cpu_time.Value + + true + + + + + CPU Time (ms) + + + + + + + textbox13 + 27 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!memory_usage.Value + + true + + + + + Memory Usage + + + + + + + textbox15 + 26 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!logical_reads.Value + + true + + + + + Logical Reads + + + + + + + textbox8 + 25 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!reads.Value + + true + + + + + Physical Reads + + + + + + + textbox18 + 24 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!writes.Value + + true + + + + + Writes + + + + + + + textbox14 + 23 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!login_name.Value + + true + + + + + Login Name + + + + + + + textbox5 + 22 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!program_name.Value + + true + + + + + Program Name + + + + + + + textbox4 + 21 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!host_name.Value + + true + + + + + Host Name + + + + + + + textbox3 + 20 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!last_request_start_time.Value + + true + + + + + Last Request Start Time + + + + + + + textbox22 + 19 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!last_request_end_time.Value + + true + + + + + Last Request End Time + + + + + + + textbox20 + 18 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + User Process + + + + + + + textbox19 + 17 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + NT Domain + + + + + + + textbox11 + 16 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!nt_user_name.Value + + true + + + + + NT User Name + + + + + + + textbox9 + 15 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + =Fields!session_id.Value + + + + + + + session_id + + + + + session_details + + + =Parameters!Server.Value + + + =Fields!session_id.Value + + + =Parameters!version_string.Value + + + + + + + 14 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!status.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!cpu_time.Value + + + + + + + cpu_time + 12 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!memory_usage.Value + + + + + + + memory_usage + 11 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!logical_reads.Value + + + + + + + logical_reads + 10 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!reads.Value + + + + + + + reads + 9 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!writes.Value + + + + + + + writes + 8 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!login_name.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!program_name.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!host_name.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!last_request_start_time.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!last_request_end_time.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!is_user_process.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!nt_domain.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!nt_user_name.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + After + true + + + + Detail + + + + + Detail_Collection + Output + true + + + + SESSION_DETAILS + 0.125in + 0.4in + 21.16667in + + + + 0.4in + + + + + + + true + true + + + + + ="Report Local Time: " & Globals!ExecutionTime + + + + + + + textbox2 + 0.375in + 0.125in + 0.25in + 3in + 1 + + + + Embedded + sql_logo + Fit + 9.125in + 0.5in + 1.75in + 2 + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + true + true + + + + + ="Dashboard Version: " + Parameters!version_string.Value + + + + + + + 7.75in + 0.25in + 3.125in + 1 + + + + + + + + + + true + true + + + + + =First(Fields!max_files.Value) + + + + + + + 1in + 1in + 0.2in + 2in + 1 + + + + true + true + + + + + =First(Fields!last_event_time.Value) + + + + + + + 0.8in + 1in + 0.2in + 2in + 2 + + + + true + true + + + + + =First(Fields!stop_time.Value) + + + + + + + 0.6in + 1in + 0.2in + 2in + 3 + + + + true + true + + + + + =First(Fields!start_time.Value) + + + + + + + 0.4in + 1in + 0.2in + 2in + 4 + + + + true + true + + + + + =IIf(Fields!is_rowset.Value = 0, Fields!path.Value, "rowset trace: client/GUI traces can negatively impact server performance") + + + + + + + 0.2in + 1in + 0.2in + 6.875in + 5 + + + + true + true + + + + + Trace ID + + + + + + + true + true + + + + + =Fields!trace_id.Value + + + + + + + trace_id_1 + 1in + 0.2in + 2.875in + 7 + + + + + + + 1in + + + 1.125in + + + 5.75in + + + + + 0.2in + + + + + true + true + + + + + Event ID + + + + + + + textbox19 + 9 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Event Name + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 2 + + + + + + + 0.2in + + + + + true + true + + + + + =Fields!trace_event_id.Value + + + + + + + trace_event_id + 7 + + + =IIf(CBool(Fields!expensive_event.Value) = true, "Yellow", "White") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!trace_event_name.Value + + + + + + =IIf(CBool(Fields!expensive_event.Value) = true, "Yellow", "White") + 2pt + 2pt + 2pt + 2pt + + + 2 + + + + + + + 0.2in + + + + + true + true + + + + + + + + + + + + textbox23 + 5 + + + =IIf(CBool(Fields!expensive_event.Value) = true, "Yellow", "White") + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Column ID + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Column Name + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + =Fields!trace_column_id.Value + + + + + + + trace_column_id + 1 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!trace_column_name.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + After + true + + + + + =Fields!trace_event_name.Value + + + + + =Fields!trace_event_id.Value + + + + + After + true + + + + true + trace_event_id + + After + true + + + + Detail + + + + + true + trace_event_id + + + + Detail_Collection + Output + true + + + + + + TRACE_EVENTS_COLUMNS + 2.1in + 0.8in + 7.875in + 8 + + true + details + + + + + + + + 3in + 0in + 7.875in + 10 + + 2pt + + + + + true + true + + + + + =First(Fields!buffer_count.Value) + + + + + + + buffer_count + 0.4in + 5.625in + 0.2in + 2.25in + 11 + + + + true + true + + + + + =First(Fields!event_count.Value) + + + + + + + event_count + 0.8in + 5.625in + 0.2in + 2.25in + 12 + + + + true + true + + + + + Trace Buffers + + + + + + + true + true + + + + + Events Traced + + + + + + + true + true + + + + + Trace Buffer Size + + + + + + + true + true + + + + + =First(Fields!buffer_size.Value) & " KB" + + + + + + + buffer_size + 0.6in + 5.625in + 0.2in + 2.25in + 16 + + + + true + true + + + + + =IIf(First(Fields!max_size.Value) is Nothing, "", First(Fields!max_size.Value) & " MB") + + + + + + + max_size + 1in + 5.625in + 0.2in + 2.25in + 17 + + + + + + Embedded + warning + 0.33333in + 0.33333in + + + + + + + ContentsOnly + 1.3in + 0.5in + 7.875in + 18 + + =IIf(Max(Fields!expensive_event.Value, "list1_Details_Group") = true, false, true) + + + + + + + + true + true + + + + + =IIf(Fields!status.Value = 0, "Stopped", "Running") + + + + + + + textbox3 + 5.625in + 0.2in + 2.25in + 20 + + + + true + true + + + + + Max Files + + + + + + + true + true + + + + + Last Event + + + + + + + true + true + + + + + Stop Time + + + + + + + true + true + + + + + Start Time + + + + + + + true + true + + + + + File Name + + + + + + + true + + + + + + + 0.1in + 1.7in + 0.2in + 2.2in + + + + true + true + + + + + =First(Fields!target_name.Value) + + + + + + + 0.3in + 1.7in + 0.2in + 2.2in + 1 + + + + true + true + + + + + =First(Fields!execution_count.Value) + + + + + + + 0.7in + 1.7in + 0.2in + 2.2in + 2 + + + + true + true + + + + + Session Name + + + + + + + true + true + + + + + Session Target + + + + + + + true + true + + + + + Target Executions + + + + + + + true + true + + + + + =First(Fields!execution_duration_ms.Value) + + + + + + + 0.9in + 1.7in + 0.2in + 2.2in + 6 + + + + true + true + + + + + Execution Duration (ms) + + + + + + + + + + 2.1in + + + 2.1in + + + + + 0.2in + + + + + true + true + + + + + Event Name + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Action + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + =Fields!event_name.value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!action_name.value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + After + true + + + + + =Fields!event_name.Value + + + + + After + true + + + + Detail + + + + + true + Xevent_name + + + + Detail_Collection + Output + true + + + + + + 1.4in + 0.1in + 0.6in + 4.2in + 8 + + true + EventsActionsTextBox + + + + + + + true + true + + + + + Configured Events: + + + + + + + 2.3in + 0in + 7.875in + 10 + + 2pt + + + + + true + true + + + + + =FormatNumber(First(Fields!total_buffer_size.Value)/1000,0) & " KB" + + + + + + + 0.3in + 5.4in + 0.2in + 2.2in + 11 + + + + true + true + + + + + Total Buffer Size + + + + + + + true + true + + + + + =First(Fields!buffer_policy_desc.Value) + + + + + + + 0.5in + 5.4in + 0.2in + 2.2in + 13 + + + + true + true + + + + + Buffer Policy + + + + + + + true + true + + + + + =FormatNumber(First(Fields!dropped_event_count.Value),0) + + + + + + + 0.7in + 5.4in + 0.2in + 2.2in + 15 + + + + true + true + + + + + Dropped Events + + + + + + + true + true + + + + + =First(Fields!create_time.Value) + + + + + + + 0.5in + 1.7in + 0.2in + 2.2in + 17 + + + + true + true + + + + + Session Creation Time + + + + + + + true + + + 8.65in + + + 0.7in + true + true + + + true + true + + + + + ="Report Local Time: " & Globals!ExecutionTime + + + + + + + 0.4in + 0.1in + 0.25in + 2.5in + + + + true + true + + + + + =iif(Parameters!TracingType.Value=1, "Active Traces", "Active Extended Event Sessions") + + + + + + + Embedded + sql_logo + Fit + 6.9in + 0.5in + 1.75in + 2 + + + + + + + true + true + + + + + ="Dashboard Version: " + Parameters!version_string.Value + + + + + + + 4.875in + 0.25in + 3.125in + 1 + + + + + + + + + + true + true + + + + + =Sum(Fields!wait_time.Value) & " ms" + + + + + + + 0.25in + 5.5in + 0.25in + 2.375in + 1 + + + + true + true + + + + + =Count(Fields!session_id.Value) - 1 + + + + + + + 5.5in + 0.25in + 1in + 2 + + + + true + true + + + + + Blocked Sessions + + + + + + + true + true + + + + + Wait Time + + + + + + + true + true + + + + + Head Blocker + + + + + + + true + true + + + + + =Fields!head_wait_resource.Value + + + + + + + true + true + + + + + =Fields!session_id.Value + + + + + + + session_id_1 + 1.375in + 0.25in + 2.625in + 7 + + + + true + true + + + + + Wait Resource + + + + + + + true + true + + + + + =Fields!program_name.Value + + + + + + + true + true + + + + + Program Name + + + + + + + 3.375in + 0in + 15.375in + 11 + + 2pt + + + + + + + Embedded + warning_1 + 0.33333in + 0.33333in + + + + + + + ContentsOnly + 1in + 0.375in + 7.875in + 12 + + =IIf(Fields!session_or_request_status.Value = "idle" and Fields!seconds_active_idle.Value > 15, False, true) + + + + + + + + true + true + + + + + =First(Fields!query_text.Value) + + + + + + + query_2 + + + + + query_plan + + + =Parameters!Server.Value + + + =Fields!plan_handle.Value + + + =Fields!sql_handle.Value + + + =Fields!statement_start_offset.Value + + + =Fields!statement_end_offset.Value + + + =Parameters!version_string.Value + + + + + + + 1.375in + 0.25in + 6.375in + 1 + + + 2pt + 2pt + 2pt + 2pt + + + + ContentsOnly + 0.75in + 0.25in + 7.875in + 13 + + =IIf(First(Fields!query_text.Value) is Nothing, true, false) + + + + + + + + true + true + + + + + =Fields!open_transaction_count.Value + + + + + + + open_transaction_count + 0.5in + 1.375in + 0.25in + 2.625in + 15 + + + + + + Embedded + warning_1 + 0.33333in + 0.33333in + + + + + + + ContentsOnly + 1.375in + 0.375in + 7.875in + 16 + + =IIf(Fields!session_or_request_status.Value <> "idle" and Fields!seconds_active_idle.Value > 60, False, true) + + + + + + + + 39 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Status + + + + + + + 38 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Transaction Name + + + + + + + textbox26 + 37 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Isolation Level + + + + + + + textbox34 + 36 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Wait Type + + + + + + + 35 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Wait Time (ms) + + + + + + + 34 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Wait Resource + + + + + + + 33 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 3 + + + + + + + + true + true + + + + + Query Text + + + + + + + 32 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 3 + + + + + + + + 0.2in + + + + + true + true + + + + + =Fields!session_id.Value & IIf(Fields!request_id.Value is Nothing, "", ":" & Fields!request_id.Value) + + + + + + + + + + + session_details + + + =Parameters!Server.Value + + + =Fields!session_id.Value + + + =Parameters!version_string.Value + + + + + + + 31 + + + =((Fields!tree_level.Value * 10) + 2).ToString() & "pt" + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!session_or_request_status.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!transaction_name.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Switch(Fields!transaction_isolation_level.Value = 0, "Read Committed", + Fields!transaction_isolation_level.Value = 1, "Read Uncommitted", + Fields!transaction_isolation_level.Value = 2, "Read Committed", + Fields!transaction_isolation_level.Value = 3, "Repeatable Read", + Fields!transaction_isolation_level.Value = 4, "Serializable", + Fields!transaction_isolation_level.Value = 5, "Snapshot", + true, Fields!transaction_isolation_level.Value.ToString()) + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_type.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_time.Value + + + + + + + 26 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_resource.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + 3 + + + + + + + + true + true + + + + + =Fields!query_text.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + 3 + true + + + + + + + + 0.375in + + + + + true + true + + + + + + + + + + + + textbox10 + 23 + + + + + + + + true + true + + + + + Transaction ID + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Transaction Begin Time + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Transaction State + + + + + + + 20 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Transaction Type + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Enlist Count + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + User Transaction + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Local + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Enlisted + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Bound + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + DTC State + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + DTC Isolation Level + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + =Fields!transaction_id.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!transaction_begin_time.Value + + + + + + + transaction_begin_time + 9 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Switch(Fields!transaction_state.Value = 0, "Initializing", +Fields!transaction_state.Value = 1, "Initialized", +Fields!transaction_state.Value = 2, "Active", +Fields!transaction_state.Value = 3, "Ended", +Fields!transaction_state.Value = 4, "Preparing", +Fields!transaction_state.Value = 5, "Prepared", +Fields!transaction_state.Value = 6, "Committed", +Fields!transaction_state.Value = 7, "Rolling back", +Fields!transaction_state.Value = 8, "Rolled back", +true, Fields!transaction_state.Value.ToString()) + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Switch(Fields!transaction_type.Value = 1, "Read/Write", +Fields!transaction_type.Value = 2, "Read only", +Fields!transaction_type.Value = 3, "System", +Fields!transaction_type.Value = 4, "Distributed", +true, Fields!transaction_type.Value.ToString()) + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!enlist_count.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!is_user_transaction.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!is_local.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!is_enlisted.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!is_bound.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Switch(Fields!dtc_state.Value = 1, "Active", +Fields!dtc_state.Value = 2, "Prepared", +Fields!dtc_state.Value = 3, "Committed", +Fields!dtc_state.Value = 4, "Aborted", +Fields!dtc_state.Value = 5, "Recovered", +true, Fields!dtc_state.Value.ToString()) + + + + + + + dtc_state_1 + 1 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!dtc_isolation_level.Value + + + + + + + dtc_isolation_level + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + + + + + + + + + After + true + + + + + =Fields!session_id.Value + + =Fields!blocking_session_id.Value + + + + + Detail + + + + + + true + transaction_name + + + + + true + transaction_name + + + + Detail_Collection + Output + true + + + + + + BLOCKING + 2.125in + 1.15in + 16in + 17 + + true + view_details + + + + + + + + 3.875in + + + + + + + true + true + + + + + ="Report Local Time: " & Globals!ExecutionTime + + + + + + + 0.375in + 0.125in + 0.25in + 2.625in + 1 + + + + Embedded + sql_logo + Fit + 9.125in + 0.5in + 1.75in + 2 + + + + + + + true + true + + + + + ="Dashboard Version: " + Parameters!version_string.Value + + + + + + + 7.625in + 0.25in + 3.125in + 1 + + + + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 2 + + + + + + + true + true + + + + + # of Waiters + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Wait Time (ms) + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + + + + + + + + + + + + 0.2in + + + + + true + true + + + + + =Fields!wait_resource.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + 2 + + + + + + + true + true + + + + + =Count(Fields!session_id.Value) + + + + + + + session_id_1 + 15 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Sum(Fields!wait_time.Value) + + + + + + + wait_time_2 + 14 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + + + + + + + + + + + + 0.375in + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + Session ID : Request ID + + + + + + + textbox7 + 10 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Wait Type + + + + + + + wait_time + 9 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Wait Time (ms) + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Blocking Session ID + + + + + + + textbox6 + 7 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Query Text + + + + + + + textbox40 + 6 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + =Fields!session_id.Value & IIf(Fields!request_id.Value is Nothing, "", ":" & Fields!request_id.Value) + + + + + + + session_id + + + + + session_details + + + =Parameters!Server.Value + + + =Fields!session_id.Value + + + =Parameters!version_string.Value + + + + + + + 4 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_type.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_time.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!blocking_session_id.Value + + + + + + + blocking_session_id + + + + + session_details + + + =Parameters!Server.Value + + + =Fields!blocking_session_id.Value + + + =Parameters!version_string.Value + + + + + + + 1 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!query_text.Value + + + + + + + textbox41 + + + + + query_plan + + + =Parameters!Server.Value + + + =Fields!plan_handle.Value + + + =Fields!sql_handle.Value + + + =Fields!statement_start_offset.Value + + + =Fields!statement_end_offset.Value + + + =Parameters!version_string.Value + + + + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + + + true + After + true + + + + + =Fields!wait_resource.Value + + + + + =Sum(Fields!wait_time.Value) + Descending + + + + + After + true + + + + true + wait_resource + + After + true + + + + Detail + + + + + true + wait_resource + + + + Detail_Collection + Output + true + + + + + + There are currently no requests waiting on a buffer latch. + REQUEST_IO_WAITS + 0.375in + 0.125in + 1.025in + 11.875in + + + + + + + 1in + + + 1.125in + + + 1.125in + + + 1in + + + 1.125in + + + 1.125in + + + 1.125in + + + 2.75in + + + 5.75in + + + + + 0.375in + + + + + true + + =Fields!session_id.Value + + true + + + + + Session ID : Request ID + + + + + + + textbox8 + 17 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!cache_hit_ratio.Value + + true + + + + + Cache Hit Ratio + + + + + + + textbox21 + 16 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!reads.Value + + true + + + + + Physical Reads + + + + + + + textbox9 + 15 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!logical_reads.Value + + true + + + + + Logical Reads + + + + + + + textbox19 + 14 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!writes.Value + + true + + + + + Writes + + + + + + + textbox18 + 13 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Wait Type + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Wait Time + + + + + + + textbox15 + 11 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Wait Resource + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Query Text + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + =Fields!session_id.Value & IIf(Fields!request_id.Value is Nothing, "", ":" & Fields!request_id.Value) + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatPercent(Fields!cache_hit_ratio.Value, 3) + + + + + + + cache_hit_ratio + 7 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!reads.Value + + + + + + + reads + 6 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!logical_reads.Value + + + + + + + logical_reads + 5 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!writes.Value + + + + + + + writes + 4 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_type.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_time.Value + + + + + + + wait_time_1 + 2 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_resource.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!query_text.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + true + + + + + + + + + + + + + + + + + + + + + + + true + After + true + + + + Detail + + + + =Fields!reads.Value + Descending + + + + + + Detail_Collection + Output + true + + + + There are currently no user requests which have performed any physical reads. + LARGEST_IO_REQUESTS + 1.75in + 0.125in + 0.575in + 16.125in + 1 + + + + true + true + + + + + This following table shows all current requests that are waiting on a buffer IO, grouped by the page they are waiting on. + + + + + + + true + true + + + + + This following table shows the current requests that have performed the most physical IO. + + + + + + + 2.325in + + + + + + + true + true + + + + + ="Report Local Time: " & Globals!ExecutionTime + + + + + + + 0.375in + 0.125in + 0.25in + 3in + 1 + + + + Embedded + sql_logo + Fit + 9.125in + 0.5in + 1.75in + 2 + + + + + + + true + true + + + + + ="Dashboard Version: " + Parameters!version_string.Value + + + + + + + 7.625in + 0.25in + 3.125in + 1 + + + + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 2 + + + + + + + true + true + + + + + # of Waiters + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Wait Time (ms) + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + + + + + + + + + + + + 0.2in + + + + + true + true + + + + + =Fields!wait_resource.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + 2 + + + + + + + true + true + + + + + =Count(Fields!session_id.Value) + + + + + + + session_id_1 + 15 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Sum(Fields!wait_time.Value) + + + + + + + wait_time_2 + 14 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + + + + + + + + + + + + 0.375in + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + Session ID: Request ID + + + + + + + textbox7 + 10 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Wait Type + + + + + + + wait_time + 9 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Wait Time (ms) + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Blocking Session ID + + + + + + + textbox6 + 7 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Query Text + + + + + + + textbox40 + 6 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + =Fields!session_id.Value & IIf(Fields!request_id.Value is Nothing, "", ":" & Fields!request_id.Value) + + + + + + + session_id + + + + + session_details + + + =Parameters!Server.Value + + + =Fields!session_id.Value + + + =Parameters!version_string.Value + + + + + + + 4 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_type.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_time.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!blocking_session_id.Value + + + + + + + blocking_session_id + + + + + session_details + + + =Parameters!Server.Value + + + =Fields!blocking_session_id.Value + + + =Parameters!version_string.Value + + + + + + + 1 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!query_text.Value + + + + + + + textbox41 + + + + + query_plan + + + =Parameters!Server.Value + + + =Fields!plan_handle.Value + + + =Fields!sql_handle.Value + + + =Fields!statement_start_offset.Value + + + =Fields!statement_end_offset.Value + + + =Parameters!version_string.Value + + + + + + + + + 2pt + 2pt + 2pt + 2pt + + + true + + + + + + + + + + + + + + + + + + + + true + After + true + + + + + =Fields!wait_resource.Value + + + + + =Sum(Fields!wait_time.Value) + Descending + + + + + After + true + + + + true + wait_resource + + After + true + + + + Detail + + + + + true + wait_resource + + + + Detail_Collection + Output + true + + + + + + There are currently no sessions waiting on a buffer latch. + REQUEST_IO_WAITS + 0.5in + 0.125in + 1.025in + 10.125in + + + + true + true + + + + + Buffer latches are used for in-memory synchronization while accessing a particular database page. This reports shows all sessions waiting on a buffer latch, grouped by the page they are trying to access. + + + + + + + 1.525in + + + + + + + true + true + + + + + ="Report Local Time: " & Globals!ExecutionTime + + + + + + + 0.375in + 0.125in + 0.25in + 3in + 1 + + + + Embedded + sql_logo + Fit + 8.375in + 0.5in + 1.75in + 2 + + + + + + + true + true + + + + + ="Dashboard Version: " + Parameters!version_string.Value + + + + + + + 7in + 0.25in + 3.125in + 1 + + + + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 3 + + + + + + + + true + true + + + + + # of Waiters + + + + + + + 20 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Wait Time (ms) + + + + + + + 19 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + % Wait Time + + + + + + + 18 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + + + + + + 0.25in + + + + + true + + true + + true + + + + + =Fields!wait_category.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + 3 + + + + + + + + true + true + + + + + =Count(Fields!request_id.Value) + + + + + + + num_waits + 15 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Sum(Fields!wait_time.Value) + + + + + + + wait_time + 14 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =FormatPercent(IIf(Sum(Fields!wait_time.Value, "REQUESTS_WAITS") > 0, Sum(Fields!wait_time.Value) / Sum(Fields!wait_time.Value, "REQUESTS_WAITS"), 1), 2) + + + + + + + 13 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.375in + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + Session ID: Request ID + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Wait Type + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Wait Time (ms) + + + + + + + 8 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Wait Resource + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + 2 + + + + + + + true + true + + + + + Query Text + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.25in + + + + + true + true + + + + + + + + + + + + + + + + true + true + + + + + =Fields!session_id.Value & IIf(Fields!request_id.Value is Nothing, "", ":" & Fields!request_id.Value) + + + + + + + session_id + + + + + session_details + + + =Parameters!Server.Value + + + =Fields!session_id.Value + + + =Parameters!version_string.Value + + + + + + + 4 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_type.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_time.Value + + + + + + + 2 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_resource.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + 2 + + + + + + + true + true + + + + + =Fields!query_text.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + true + + + + + + + + + + + + + + + + + + + + + After + true + + + + + =Fields!wait_category.Value + + + + + =sum(Fields!wait_time.Value) + Descending + + + + + After + true + + + + wait_category + + After + true + + + + Detail + + + + =Fields!wait_time.Value + Descending + + + + + + wait_category + + + + Detail_Collection + Output + true + + + + + + There are currently no requests waiting on a resource. + REQUESTS_WAITS + 3.375in + 0.125in + 1.125in + 13.75in + + + true + -90 + + + + 6pt + + 0.75pt + + + + Wait Category + + + False + 1 + + False + + 0.75pt + + + NaN + + + False + + 0.75pt + + + NaN + -1 + + + True + + 0.75pt + + + NaN + + + None + + NaN + NaN + true + true + false + + + + + + + NaN + Opposite + NaN + NaN + + + 0.75pt + + + + Wait Time (ms) + + + True + + True + + 0.75pt + + + NaN + + + False + + 0.75pt + + + NaN + + + True + + 0.75pt + + + NaN + + + None + + true + 0 + true + true + false + + + + + + + NaN + Opposite + NaN + NaN + + + 0.75pt + + LightGrey + + + + + + true + + 0.75pt + + + RightCenter + Column + + + + + true + + + + + Cumulative Wait Time By Type + + + + + + + + No Data Available + + + REQUESTS_WAITS + 3.125in + 7.375in + + + __Upgraded2005__ + __Upgraded2005__ + + + + + + ContentsOnly + 0.125in + 0.125in + 3.125in + 7.75in + 1 + + =IIf(Count(Fields!session_id.Value, "REQUESTS_WAITS") = 0, true, false) + + + + + + + + true + true + + + + + ="Report Local Time: " & Globals!ExecutionTime + + + + + + + 0.375in + 0.125in + 0.25in + 3in + 1 + + + + Embedded + sql_logo + Fit + 7.625in + 0.5in + 1.75in + 2 + + + + + + + true + true + + + + + ="Dashboard Version: " + Parameters!version_string.Value + + + + + + + 6.125in + 0.25in + 3.125in + 1 + + + + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!waiting_requests_count.Value + + true + + + + + # of Waits + + + + + + + textbox3 + 6 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!wait_time_ms.Value + + true + + + + + Wait Time (ms) + + + + + + + textbox4 + 5 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + + =Fields!max_wait_time_ms.Value + + true + + + + + Max Wait Time (ms) + + + + + + + textbox5 + 4 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + =Fields!latch_class.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!waiting_requests_count.Value + + + + + + + waiting_requests_count + 2 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_time_ms.Value + + + + + + + wait_time_ms + 1 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!max_wait_time_ms.Value + + + + + + + max_wait_time_ms + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + true + After + true + + + + Detail + + + + =Fields!wait_time_ms.Value + Descending + + + + + + Detail_Collection + Output + true + + + + LATCH_STATS + 1.375in + 0.125in + 0.4in + 9.375in + + + + + + + 1in + + + 1.75in + + + 1.375in + + + 2.375in + + + 5.5in + + + + + 0.375in + + + + + true + true + + + + + Session ID: Request ID + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Wait Type + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Wait Time (ms) + + + + + + + textbox12 + 7 + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Wait Resource + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Query Text + + + + + + Gainsboro + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.2in + + + + + true + true + + + + + =Fields!session_id.Value & IIf(Fields!request_id.Value is Nothing, "", ":" & Fields!request_id.Value) + + + + + + + session_id + + + + + session_details + + + =Parameters!Server.Value + + + =Fields!session_id.Value + + + =Parameters!version_string.Value + + + + + + + 4 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_type.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_time.Value + + + + + + + wait_time + 2 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!wait_resource.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!query_text.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + true + + + + + + + + + + + + + + + + + + + true + After + true + + + + Detail + + + + + Detail_Collection + Output + true + + + + There are currently no requests waiting on a non-buffer latch. + REQUESTS_WITH_LATCH_WAITS + 0.375in + 0.125in + 0.575in + 12in + 1 + + + + true + true + + + + + This table shows all current requests with a non-buffer latch wait. + + + + + + + true + true + + + + + The following table shows aggregate wait statistics for each latch class. This data is cumulative since server startup or since performance statistics were last reset. + + + + + + + 1.775in + + + + + + + true + true + + + + + ="Report Local Time: " & Globals!ExecutionTime + + + + + + + 0.375in + 0.125in + 0.25in + 3in + 1 + + + + Embedded + sql_logo + Fit + 9.125in + 0.5in + 1.75in + 2 + + + + + + + true + true + + + + + ="Dashboard Version: " + Parameters!version_string.Value + + + + + + + 7.875in + 0.25in + 3.125in + 1 + + + + + + + + + 2pt + 2pt + 2pt + 2pt + + + + 2.25in + + + + + 6in + + + 0.45in + true + true + + + true + true + + + + + =Globals!ExecutionTime + + + + ExecutionTime + 0.2in + 4in + 0.25in + 2in + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 1in + 1in + 1in + 1in +