I have a situation in my SQL Server 2008.
I need to change a column type, but the indexes are preventing the changes. But because of the database is on several clients, I don't know how many indexes exists involving the column.
Is there any way of getting, programmatically speaking, all indexes that involve the column and drop them, and after the alter table
statement recreate them automatically?
I've heard that disabling them can mess with the table because of the change of type.
I'm changing from tinyint to smallint type.
Also try this to know the all the indexes on table with column names:
SELECT OBJECT_SCHEMA_NAME(ind.object_id) AS SchemaName
, OBJECT_NAME(ind.object_id) AS ObjectName
, ind.name AS IndexName
, ind.is_primary_key AS IsPrimaryKey
, ind.is_unique AS IsUniqueIndex
, col.name AS ColumnName
, ic.is_included_column AS IsIncludedColumn
, ic.key_ordinal AS ColumnOrder
FROM sys.indexes ind
INNER JOIN sys.index_columns ic
ON ind.object_id = ic.object_id
AND ind.index_id = ic.index_id
INNER JOIN sys.columns col
ON ic.object_id = col.object_id
AND ic.column_id = col.column_id
INNER JOIN sys.tables t
ON ind.object_id = t.object_id
WHERE t.is_ms_shipped = 0
ORDER BY OBJECT_SCHEMA_NAME(ind.object_id) --SchemaName
, OBJECT_NAME(ind.object_id) --ObjectName
, ind.is_primary_key DESC
, ind.is_unique DESC
, ind.name --IndexName
, ic.key_ordinal
You can use below script which returns Index Name and Type for specified Table/Column.:
DECLARE @tableName SYSNAME
DECLARE @columnName SYSNAME
SET @tableName = 'Products'
SET @columnName = 'Name'
SELECT IDX.name, IDX.type_desc, IndexedColumn
FROM sys.tables TBL
INNER JOIN sys.indexes IDX ON TBL.object_id = IDX.object_id
LEFT JOIN sys.filegroups FG ON IDX.data_space_id = FG.data_space_id
CROSS APPLY
( SELECT COLS.Name
FROM sys.index_columns IXCL
INNER JOIN sys.columns COLS
ON IXCL.object_id = COLS.object_id
AND IXCL.column_id = COLS.column_id
WHERE IDX.object_id = IXCL.object_id
AND IDX.index_id = IXCL.index_id
AND COLS.name = @columnName
AND IDX.object_id = OBJECT_ID(@tableName)
) Indexed (IndexedColumn)
WHERE TBL.object_id = OBJECT_ID(@tableName)
Hope This Helps...
You can use the built-in tools to do this job. In SQL Server Management Studio, click "Tools" then "Options"
Expand the "SQL Server Object Explorer" set and Within that, click "Scripting".
Scroll down to the "Table And View Options" on the right hand side.
Find the record called "Script Indexes" and set it to "True", then click OK.
When you right click your table in the Object Explorer, you have options to "Script As..." selecting any of these options will now script out the indexes as well as the table itself and its keys. Copy the required scripts, or just run the whole thing depending on your need.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With