@@ -26,20 +26,69 @@ public partial class RemoteCollectorService
2626 /// </summary>
2727 private async Task < int > CollectQueryStoreAsync ( ServerConnection server , CancellationToken cancellationToken )
2828 {
29- /* First, get databases with Query Store enabled */
29+ /* First, get databases with Query Store actually enabled.
30+ Uses sys.database_query_store_options.actual_state instead of
31+ sys.databases.is_query_store_on, which can be out of sync on Azure SQL DB. */
3032 const string dbQuery = @"
33+ SET NOCOUNT ON;
3134SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
3235
33- SELECT /* PerformanceMonitorLite */
34- d.name
35- FROM sys.databases AS d
36- WHERE d.is_query_store_on = 1
37- AND d.database_id > 4
38- AND d.database_id < 32761
39- AND d.state_desc = N'ONLINE'
40- AND d.name <> N'PerformanceMonitor'
41- ORDER BY d.name
42- OPTION(RECOMPILE);" ;
36+ DECLARE
37+ @result TABLE (name sysname);
38+
39+ DECLARE
40+ @db sysname,
41+ @sql NVARCHAR(500);
42+
43+ DECLARE db_check CURSOR LOCAL FAST_FORWARD FOR
44+ SELECT /* PerformanceMonitorLite */
45+ d.name
46+ FROM sys.databases AS d
47+ WHERE d.database_id > 4
48+ AND d.database_id < 32761
49+ AND d.state_desc = N'ONLINE'
50+ AND d.name <> N'PerformanceMonitor'
51+ OPTION(RECOMPILE);
52+
53+ OPEN db_check;
54+
55+ FETCH NEXT
56+ FROM db_check
57+ INTO @db;
58+
59+ WHILE @@FETCH_STATUS = 0
60+ BEGIN
61+ BEGIN TRY
62+ SET @sql =
63+ N'USE ' + QUOTENAME(@db) + N';
64+ SELECT ' + QUOTENAME(@db, '''') + N'
65+ WHERE EXISTS
66+ (
67+ SELECT
68+ 1
69+ FROM sys.database_query_store_options
70+ WHERE actual_state > 0
71+ );';
72+
73+ INSERT @result (name)
74+ EXEC(@sql);
75+ END TRY
76+ BEGIN CATCH
77+ END CATCH;
78+
79+ FETCH NEXT
80+ FROM db_check
81+ INTO @db;
82+ END;
83+
84+ CLOSE db_check;
85+ DEALLOCATE db_check;
86+
87+ SELECT
88+ name
89+ FROM @result
90+ ORDER BY
91+ name;" ;
4392
4493 var serverId = GetServerId ( server ) ;
4594 var collectionTime = DateTime . UtcNow ;
0 commit comments