( '' + ' +
- 'STUFF ' +
- '( ' +
- '( ' +
- 'SELECT ' +
- ''','' + ' +
- 'QUOTENAME(COLUMN_NAME) + '' '' + ' +
- 'DATA_TYPE + ' +
- 'CASE ' +
- 'WHEN DATA_TYPE LIKE ''%char'' THEN ''('' + COALESCE(NULLIF(CONVERT(VARCHAR, CHARACTER_MAXIMUM_LENGTH), ''-1''), ''max'') + '') '' ' +
- 'ELSE '' '' ' +
- 'END + ' +
- 'CASE IS_NULLABLE ' +
- 'WHEN ''NO'' THEN ''NOT '' ' +
- 'ELSE '''' ' +
- 'END + ''NULL'' AS [text()] ' +
- 'FROM tempdb.INFORMATION_SCHEMA.COLUMNS ' +
- 'WHERE ' +
- 'TABLE_NAME = (SELECT name FROM tempdb.sys.objects WHERE object_id = OBJECT_ID(''tempdb..#session_schema'')) ' +
- 'ORDER BY ' +
- 'ORDINAL_POSITION ' +
- 'FOR XML ' +
- 'PATH('''') ' +
- '), + ' +
- '1, ' +
- '1, ' +
- ''''' ' +
- ') + ' +
- ''')''; '
- ELSE ''
- END
- --End derived table and INSERT specification
- );
-
- SET @sql_n = CONVERT(NVARCHAR(MAX), @sql);
-
- EXEC sp_executesql
- @sql_n,
- N'@schema VARCHAR(MAX) OUTPUT',
- @schema OUTPUT;
-END;
-GO
diff --git a/QueryTemplates/disk-info.sql b/QueryTemplates/disk-info.sql
new file mode 100644
index 0000000..752b3c7
--- /dev/null
+++ b/QueryTemplates/disk-info.sql
@@ -0,0 +1,10 @@
+SELECT DISTINCT
+ vs.volume_mount_point,
+ vs.file_system_type,
+ vs.logical_volume_name,
+ CONVERT(DECIMAL (18, 2), vs.total_bytes / 1024.0 / 1024 / 1024) AS [Total Size (GB)],
+ CONVERT(DECIMAL (18, 2), vs.available_bytes / 1024.0 / 1024 / 1024) AS [Available Size (GB)],
+ CONVERT(DECIMAL (18, 2), vs.available_bytes * 1. / vs.total_bytes * 100.) AS [Space Free %]
+FROM sys.master_files AS f WITH (NOLOCK) CROSS APPLY sys.dm_os_volume_stats(f.database_id, f.[file_id]) AS vs
+ORDER BY vs.volume_mount_point
+OPTION (RECOMPILE);
diff --git a/QueryTemplates/indexes-stat.sql b/QueryTemplates/indexes-stat.sql
new file mode 100644
index 0000000..6f40bdd
--- /dev/null
+++ b/QueryTemplates/indexes-stat.sql
@@ -0,0 +1,27 @@
+SELECT SCHEMA_NAME(o.schema_id) AS SchemaName,
+ OBJECT_NAME(p.object_id) AS ObjectName,
+ i.[name] AS IndexName,
+ p.index_id AS IndexID,
+ p.partition_number AS PartitionNumber,
+ FORMAT(p.[rows], 'N0') AS [Rows],
+ FORMAT(a.total_pages * 8 / 1024., 'N2') AS IndexSizeMb, --doesn't include LOB
+ p.[data_compression_desc] AS [Compression],
+ CONCAT('ALTER INDEX [', i.[name], '] ON [', SCHEMA_NAME(o.schema_id), '].[', OBJECT_NAME(p.object_id), '] REBUILD PARTITION = ',
+ CASE WHEN EXISTS (SELECT TOP 1 1 FROM sys.partition_schemes AS ps WHERE ps.data_space_id = i.data_space_id)
+ THEN CAST (p.partition_number AS VARCHAR (4)) ELSE 'ALL' END,
+ ' WITH (ONLINE = ON (WAIT_AT_LOW_PRIORITY (MAX_DURATION = 15 MINUTES, ABORT_AFTER_WAIT = SELF)), ',
+ 'SORT_IN_TEMPDB = ON, DATA_COMPRESSION=PAGE, MAXDOP = 8);') + CHAR(13) + CHAR(10) + 'GO' AS RebuildCommand
+FROM sys.partitions AS p
+ INNER JOIN sys.indexes AS i ON i.[object_id] = p.[object_id] AND i.index_id = p.index_id
+ INNER JOIN sys.tables AS o ON i.[object_id] = o.[object_id]
+ INNER JOIN sys.data_spaces AS ds ON ds.data_space_id = i.data_space_id
+ LEFT OUTER JOIN sys.allocation_units AS a ON p.[partition_id] = a.container_id AND a.data_pages > 0 AND a.total_pages > 0 -- B-tree only I guess
+WHERE 1 = 1
+ -- AND i.index_id = 1
+ -- AND OBJECT_NAME(p.[object_id]) = ''
+ -- AND SCHEMA_NAME(o.[schema_id]) = ''
+ -- AND i.[name] = ''
+ -- AND p.partition_number = 0
+ -- AND p.[rows] > 0
+ORDER BY ObjectName, PartitionNumber, IndexID;
+
diff --git a/QueryTemplates/sp_WhoIsActive.sql b/QueryTemplates/sp_WhoIsActive.sql
new file mode 100644
index 0000000..663db82
--- /dev/null
+++ b/QueryTemplates/sp_WhoIsActive.sql
@@ -0,0 +1,5 @@
+EXEC sp_WhoIsActive @show_sleeping_spids = 0
+ --,@get_plans = 1
+ --,@get_outer_command = 1
+ --,@get_locks = 1
+ --,@find_block_leaders = 1;
diff --git a/QueryTemplates/sysprocesses.sql b/QueryTemplates/sysprocesses.sql
index 9c6a8eb..0e44616 100644
--- a/QueryTemplates/sysprocesses.sql
+++ b/QueryTemplates/sysprocesses.sql
@@ -2,6 +2,8 @@ SELECT ec.client_net_address,
es.[program_name],
es.[host_name],
es.login_name,
+ ec.local_net_address,
+ ec.local_tcp_port,
DB_NAME(es.database_id) as DatabaseName,
COUNT(ec.session_id) AS [connection count],
SUM(CASE WHEN encrypt_option = 'TRUE' THEN 1 ELSE 0 END) AS [connection count (enc)]
@@ -12,7 +14,12 @@ FROM sys.dm_exec_sessions AS es WITH (NOLOCK)
WHERE 1 = 1
-- AND es.[program_name] LIKE '%%'
-- AND DB_NAME(es.database_id) = ''
- -- AND es.[host_name] LIKE '%%'
-GROUP BY ec.client_net_address, es.[program_name], es.[host_name], es.login_name, DB_NAME(es.database_id)
-ORDER BY ec.client_net_address, es.[program_name]
+ -- AND es.[host_name] LIKE '%%'
+ -- AND es.login_name = ''
+GROUP BY
+ GROUPING SETS((), --totals
+ (ec.client_net_address, es.[program_name], es.[host_name], es.login_name, ec.local_net_address, ec.local_tcp_port, DB_NAME(es.database_id)))
+ORDER BY
+ ec.client_net_address, es.[program_name]
+ -- [connection count] DESC
OPTION (RECOMPILE);
diff --git a/QueryTemplates/tables-info.sql b/QueryTemplates/tables-info.sql
new file mode 100644
index 0000000..576e3b8
--- /dev/null
+++ b/QueryTemplates/tables-info.sql
@@ -0,0 +1,102 @@
+SET NOCOUNT ON;
+DECLARE @RowsStatistics AS TABLE (ObjectId INT, PartitionCount INT, RowsCount BIGINT, UnusedPagesPercent INT, INDEX IDX CLUSTERED (ObjectId));
+INSERT INTO @RowsStatistics
+SELECT ps.object_id AS ObjectId,
+ COUNT(DISTINCT ps.partition_number) AS PartitionCount,
+ SUM(ps.row_count) AS RowsCount,
+ CASE WHEN SUM(ps.reserved_page_count) = 0 THEN 0 ELSE (SUM(ps.reserved_page_count) - SUM(ps.used_page_count)) * 100 / SUM(ps.reserved_page_count) END AS UnusedPagesPercent
+FROM sys.dm_db_partition_stats AS ps
+ INNER JOIN sys.objects AS so ON ps.object_id = so.object_id
+WHERE ps.index_id < 2
+GROUP BY ps.object_id;
+
+DECLARE @TableInfo AS TABLE (SchemaName SYSNAME, TableName SYSNAME, ObjectId INT, HasPK INT, HasClusteredIndex INT, PKisClustered INT, IsReplicated INT, IndexCount INT, CreateDate DATETIME, LastIdentityValue SQL_VARIANT NULL, IdentityType SYSNAME NULL, INDEX IDX CLUSTERED (ObjectId));
+INSERT INTO @TableInfo
+SELECT
+ OBJECT_SCHEMA_NAME(t.object_id) AS SchemaName,
+ OBJECT_NAME(t.object_id) AS TableName,
+ t.object_id AS ObjectId,
+ i.HasPK,
+ i.HasClusteredIndex,
+ i.PKisClustered,
+ t.is_replicated as IsReplicated,
+ COALESCE (i.IndexCount, 0) AS IndexCount,
+ t.create_date,
+ ic.last_value,
+ st.name
+FROM sys.tables AS t
+ LEFT OUTER JOIN
+ (SELECT si.object_id,
+ COUNT(CASE WHEN si.type_desc = 'HEAP' THEN NULL ELSE 1 END) AS IndexCount,
+ SUM(CASE WHEN si.type_desc = 'CLUSTERED' THEN 1 ELSE 0 END) AS HasClusteredIndex,
+ SUM(CASE WHEN si.is_primary_key = 1 THEN 1 ELSE 0 END) AS HasPK,
+ SUM(CASE WHEN si.type_desc = 'CLUSTERED'
+ AND si.is_primary_key = 1 THEN 1 ELSE 0 END) AS PKisClustered
+ FROM sys.indexes AS si
+ GROUP BY si.object_id) AS i
+ ON t.object_id = i.object_id
+ LEFT JOIN sys.identity_columns ic ON t.object_id = ic.object_id
+ LEFT JOIN sys.types st ON ic.system_type_id = st.system_type_id AND ic.user_type_id = st.user_type_id
+WHERE t.is_ms_shipped = 0;
+
+DECLARE @TableSizes AS TABLE (ObjectId INT, UsedSpaceMB NUMERIC (36, 2), UsedSpaceMB_Compressed NUMERIC (36, 2), UsedSpaceMB_LOB NUMERIC (36, 2), UsedSpaceMB_CS NUMERIC (36, 2), INDEX IDX CLUSTERED (ObjectId));
+INSERT INTO @TableSizes
+SELECT t.object_id AS ObjectId,
+ CAST (ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC (36, 2)) AS UsedSpaceMB,
+ CAST (ROUND(((SUM(CASE WHEN p.[data_compression] > 0 THEN a.used_pages ELSE 0 END) * 8) / 1024.00), 2) AS NUMERIC (36, 2)) AS UsedSpaceMB_Compressed,
+ CAST (ROUND(((SUM(CASE WHEN a.[type_desc] = 'LOB_DATA' AND i.[type] in (1, 2) THEN a.used_pages ELSE 0 END) * 8) / 1024.00), 2) AS NUMERIC (36, 2)) AS UsedSpaceMB_LOB,
+ CAST (ROUND(((SUM(CASE WHEN i.[type] in (5, 6) THEN a.used_pages ELSE 0 END) * 8) / 1024.00), 2) AS NUMERIC (36, 2)) AS UsedSpaceMB_CS
+FROM sys.tables AS t
+ INNER JOIN sys.indexes AS i ON t.object_id = i.object_id
+ INNER JOIN sys.partitions AS p ON i.object_id = p.object_id AND i.index_id = p.index_id
+ INNER JOIN sys.allocation_units AS a ON p.partition_id = a.container_id
+GROUP BY t.object_id;
+
+DECLARE @LastReadWrites AS TABLE (ObjectId INT, [LastWrite] DATETIME, [LastRead] DATETIME, [TotalReads] BIGINT, [TotalWrites] BIGINT, INDEX IDX CLUSTERED (ObjectId));
+INSERT INTO @LastReadWrites
+SELECT ObjectID AS ObjectID,
+ MAX([LastUserUpdate]) AS [LastWrite],
+ MAX([LastUserRead]) AS [LastRead],
+ SUM([TotalReads]) AS [TotalReads],
+ SUM([TotalWrites]) AS [TotalWrites]
+FROM (SELECT object_id AS ObjectID,
+ (last_user_update) AS [LastUserUpdate],
+ (SELECT Max(v) FROM (VALUES (last_user_seek), (last_user_scan), (last_user_lookup)) AS value(v)) AS [LastUserRead],
+ (user_updates) AS [TotalWrites],
+ (user_seeks + user_scans + user_lookups) AS [TotalReads]
+ FROM sys.dm_db_index_usage_stats
+ WHERE database_id = DB_ID()) AS a
+GROUP BY ObjectID;
+
+SELECT DB_NAME() AS DatabaseName,
+ ti.SchemaName,
+ ti.TableName,
+ FORMAT(RS.RowsCount, 'N0') AS RowsCount,
+ FORMAT(TS.UsedSpaceMB, 'N0') AS UsedSpaceMB,
+ -- FORMAT(TS.UsedSpaceMB_LOB, 'N0') AS UsedSpaceMB_LOB,
+ -- FORMAT(TS.UsedSpaceMB_CS, 'N0') AS UsedSpaceMB_CS,
+ FORMAT(TS.UsedSpaceMB_Compressed, 'N0') AS UsedSpaceMB_ZIP,
+ RS.PartitionCount,
+ ti.IndexCount,
+ ti.HasPK,
+ ti.HasClusteredIndex,
+ ti.PKisClustered,
+ ti.IsReplicated,
+ L.LastWrite,
+ L.LastRead,
+ L.TotalReads,
+ L.TotalWrites,
+ ti.CreateDate,
+ RS.UnusedPagesPercent,
+ ti.LastIdentityValue,
+ ti.IdentityType
+FROM @TableInfo AS ti
+ LEFT JOIN @RowsStatistics AS RS ON RS.ObjectId = ti.ObjectId
+ LEFT JOIN @LastReadWrites AS L ON L.ObjectId = RS.ObjectId
+ LEFT JOIN @TableSizes AS TS ON TS.ObjectId = ti.ObjectId
+WHERE 1 = 1
+ --AND ti.TableName IN ('','')
+ --AND ti.SchemaName = ''
+ --AND RS.RowsCount > 0
+ORDER BY TS.UsedSpaceMB DESC;
+-- ORDER BY TS.UsedSpaceMB - TS.UsedSpaceMB_LOB DESC;
diff --git a/QueryTemplates/trn-log-info.sql b/QueryTemplates/trn-log-info.sql
new file mode 100644
index 0000000..8c55190
--- /dev/null
+++ b/QueryTemplates/trn-log-info.sql
@@ -0,0 +1,30 @@
+SELECT db.[name] AS [Database Name], SUSER_SNAME(db.owner_sid) AS [Database Owner],
+db.[compatibility_level] AS [DB Compatibility Level],
+db.recovery_model_desc AS [Recovery Model],
+db.log_reuse_wait_desc AS [Log Reuse Wait Description],
+CONVERT(DECIMAL(18,2), ds.cntr_value/1024.0) AS [Total Data File Size on Disk (MB)],
+CONVERT(DECIMAL(18,2), ls.cntr_value/1024.0) AS [Total Log File Size on Disk (MB)],
+CONVERT(DECIMAL(18,2), lu.cntr_value/1024.0) AS [Log File Used (MB)],
+CAST(CAST(lu.cntr_value AS FLOAT) / CAST(ls.cntr_value AS FLOAT)AS DECIMAL(18,2)) * 100 AS [Log Used %],
+db.page_verify_option_desc AS [Page Verify Option], db.user_access_desc, db.state_desc, db.containment_desc, --db.is_mixed_page_allocation_on,
+db.is_auto_create_stats_on, db.is_auto_update_stats_on, db.is_auto_update_stats_async_on, db.is_parameterization_forced,
+db.snapshot_isolation_state_desc, db.is_read_committed_snapshot_on, db.is_auto_close_on, db.is_auto_shrink_on,
+db.target_recovery_time_in_seconds, db.is_cdc_enabled, db.is_published, db.is_distributor, db.is_sync_with_backup,
+db.group_database_id, db.replica_id, --db.is_memory_optimized_enabled,
+db.is_memory_optimized_elevate_to_snapshot_on, db.delayed_durability_desc, db.is_query_store_on,
+-- db.is_temporal_history_retention_enabled, db.is_accelerated_database_recovery_on,
+db.is_master_key_encrypted_by_server, db.is_encrypted, de.encryption_state, de.percent_complete, de.key_algorithm, de.key_length
+FROM sys.databases AS db WITH (NOLOCK)
+LEFT OUTER JOIN sys.dm_os_performance_counters AS lu WITH (NOLOCK)
+ON db.name = lu.instance_name
+LEFT OUTER JOIN sys.dm_os_performance_counters AS ls WITH (NOLOCK)
+ON db.name = ls.instance_name
+LEFT OUTER JOIN sys.dm_os_performance_counters AS ds WITH (NOLOCK)
+ON db.name = ds.instance_name
+LEFT OUTER JOIN sys.dm_database_encryption_keys AS de WITH (NOLOCK)
+ON db.database_id = de.database_id
+WHERE lu.counter_name LIKE N'Log File(s) Used Size (KB)%'
+AND ls.counter_name LIKE N'Log File(s) Size (KB)%'
+AND ds.counter_name LIKE N'Data File(s) Size (KB)%'
+AND ls.cntr_value > 0
+ORDER BY db.[name] OPTION (RECOMPILE);
diff --git a/README.md b/README.md
index bd4e79f..c43dc5a 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,8 @@
+> [!WARNING]
+> # Repository Archived
+> This repository is no longer active, as we have moved to a newer version. For the latest updates and features, please visit the new repository at [Axial SQL Tools](https://github.com/Axial-SQL/AxialSqlTools). We encourage you to check out the new version for the most up-to-date tools and improvements.
+
+
SQL Server Management Studio 2018 Productivity Tool (Addin)
Work in progress... I had to make it as an "ugly" toolbox window because I couldn't figure out how to make a dynamic menu in a toolbar.
@@ -7,7 +12,7 @@
.NET 4.7.2 is required.
-To install the addin unpack files from the most recent release into C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\Extensions folder.
+To install the addin unpack files from the most recent release into C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\Extensions folder.