From 9d2b42cb21b617e447956abcfe699b3086582a98 Mon Sep 17 00:00:00 2001 From: Hannah Vernon Date: Tue, 18 Mar 2025 14:55:54 -0500 Subject: [PATCH 1/3] added QUOTENAME to the output of the 'original_index_definition' column. Added terminating semi-colon to the `original_index_definition` column. Modified the order of included columns to match the `column_id` from sys.columns to more closely resemble the output from SSMS script index command. --- sp_IndexCleanup/sp_IndexCleanup.sql | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/sp_IndexCleanup/sp_IndexCleanup.sql b/sp_IndexCleanup/sp_IndexCleanup.sql index 40fde3bd..9e85c918 100644 --- a/sp_IndexCleanup/sp_IndexCleanup.sql +++ b/sp_IndexCleanup/sp_IndexCleanup.sql @@ -453,6 +453,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. index_id integer NOT NULL, index_name sysname NULL, column_name sysname NOT NULL, + column_id int NOT NULL, is_primary_key bit NULL, is_unique bit NULL, is_unique_constraint bit NULL, @@ -1446,6 +1447,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. table_name = t.name, index_name = ISNULL(i.name, t.name + N''.Heap''), column_name = c.name, + column_id = c.column_id, i.is_primary_key, i.is_unique, i.is_unique_constraint, @@ -1620,6 +1622,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. table_name, index_name, column_name, + column_id, is_primary_key, is_unique, is_unique_constraint, @@ -1903,7 +1906,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ( SELECT N', ' + - id2.column_name + + QUOTENAME(id2.column_name) + CASE WHEN id2.is_descending_key = 1 THEN N' DESC' @@ -1934,7 +1937,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ( SELECT N', ' + - id2.column_name + QUOTENAME(id2.column_name) FROM #index_details id2 WHERE id2.object_id = id1.object_id AND id2.index_id = id1.index_id @@ -1972,6 +1975,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ELSE N'CREATE ' + CASE WHEN id1.is_unique = 1 THEN N'UNIQUE ' ELSE N'' END + + CASE WHEN id1.index_id > 0 THEN N'NONCLUSTERED ' ELSE N'' END + N'INDEX ' + QUOTENAME(id1.index_name) + N' ON ' + @@ -1987,7 +1991,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ( SELECT N', ' + - id2.column_name + + QUOTENAME(id2.column_name) + CASE WHEN id2.is_descending_key = 1 THEN N' DESC' @@ -2029,14 +2033,16 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ( SELECT N', ' + - id4.column_name + QUOTENAME(id4.column_name) FROM #index_details id4 WHERE id4.object_id = id1.object_id AND id4.index_id = id1.index_id AND id4.is_included_column = 1 GROUP BY + id4.column_id, id4.column_name ORDER BY + id4.column_id, id4.column_name FOR XML @@ -2054,7 +2060,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. WHEN id1.filter_definition IS NOT NULL THEN N' WHERE ' + id1.filter_definition ELSE N'' - END + END + + N';' FROM #index_details id1 WHERE id1.is_eligible_for_dedupe = 1 GROUP BY From 94d14ce5457b902b31570cb1eacbbfb5748fcace Mon Sep 17 00:00:00 2001 From: Hannah Vernon Date: Tue, 18 Mar 2025 15:21:54 -0500 Subject: [PATCH 2/3] added `@verbose_output` parameter to control output of NONUNIQUE and NONCLUSTERED to the original_index_definition output column. --- sp_IndexCleanup/sp_IndexCleanup.sql | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sp_IndexCleanup/sp_IndexCleanup.sql b/sp_IndexCleanup/sp_IndexCleanup.sql index 9e85c918..c27f4c80 100644 --- a/sp_IndexCleanup/sp_IndexCleanup.sql +++ b/sp_IndexCleanup/sp_IndexCleanup.sql @@ -26,6 +26,7 @@ ALTER PROCEDURE @get_all_databases bit = 0, /*looks for all accessible user databases and returns combined results*/ @include_databases nvarchar(max) = NULL, /*comma-separated list of databases to include (only when @get_all_databases = 1)*/ @exclude_databases nvarchar(max) = NULL, /*comma-separated list of databases to exclude (only when @get_all_databases = 1)*/ + @verbose_output tinyint = 0, /* 0 -> no verbose output, 1 -> add NONUNIQUE, NONCLUSTERED type output in the original_index_defintion output */ @help bit = 'false', @debug bit = 'false', @version varchar(20) = NULL OUTPUT, @@ -1974,8 +1975,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. /* For regular indexes, use CREATE INDEX syntax */ ELSE N'CREATE ' + - CASE WHEN id1.is_unique = 1 THEN N'UNIQUE ' ELSE N'' END + - CASE WHEN id1.index_id > 0 THEN N'NONCLUSTERED ' ELSE N'' END + + CASE WHEN id1.is_unique = 1 THEN N'UNIQUE ' WHEN id1.is_unique = 0 AND @verbose_output >= 1 THEN N'NONUNIQUE ' ELSE N'' END + + CASE WHEN id1.index_id = 0 THEN N'CLUSTERED ' WHEN id1.index_id > 0 AND @verbose_output >= 1 THEN N'NONCLUSTERED ' ELSE N'' END + N'INDEX ' + QUOTENAME(id1.index_name) + N' ON ' + From 64e8c372f5fbe1022fe025991ef08c88503309ee Mon Sep 17 00:00:00 2001 From: Hannah Vernon Date: Tue, 18 Mar 2025 16:03:18 -0500 Subject: [PATCH 3/3] Removed the syntactically invalid `NONUNIQUE` bit from the `original_index_definition` column. --- sp_IndexCleanup/sp_IndexCleanup.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sp_IndexCleanup/sp_IndexCleanup.sql b/sp_IndexCleanup/sp_IndexCleanup.sql index c27f4c80..ec7da4c4 100644 --- a/sp_IndexCleanup/sp_IndexCleanup.sql +++ b/sp_IndexCleanup/sp_IndexCleanup.sql @@ -1975,7 +1975,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. /* For regular indexes, use CREATE INDEX syntax */ ELSE N'CREATE ' + - CASE WHEN id1.is_unique = 1 THEN N'UNIQUE ' WHEN id1.is_unique = 0 AND @verbose_output >= 1 THEN N'NONUNIQUE ' ELSE N'' END + + CASE WHEN id1.is_unique = 1 THEN N'UNIQUE ' ELSE N'' END + CASE WHEN id1.index_id = 0 THEN N'CLUSTERED ' WHEN id1.index_id > 0 AND @verbose_output >= 1 THEN N'NONCLUSTERED ' ELSE N'' END + N'INDEX ' + QUOTENAME(id1.index_name) +