Andy's script is great but not so clean.
I ran it against a SQL2000 database trying to drop a column along with all its constraints/indexes. Here are the issues I faced:
1. The criteria of the constraints cursor should be changed to
WHERE ((OBJECTPROPERTY(Cons.[id],'IsConstraint') = 1
OR (OBJECTPROPERTY(Cons.[id],'IsPrimaryKey') = 1))
AND Cons.info = Cols.colid)
AND Cons.parent_obj = @tableID
as you don’t want to drop the primary key if the given column is not part of it.
2. The join criteria for the sysindexes table in the indexes cursor should include a fourth line as follows:
INNER JOIN dbo.sysindexkeys SIK WITH (NOLOCK)
ON SIK.id = SC.id
AND SIK.colid = SC.colid
AND SIK.indid = SI.indid
otherwise the cursor will return duplicate rows.
3. The second line of the where criteria of the indexes cursor must be changed as follows:
WHERE SI.indid !=0
AND ISNULL(OBJECTPROPERTY(OBJECT_ID(SI.name),'IsConstraint'), 0) = 0
AND SC.id = @tableID
AND SC.name = @column
as many (valid) rows return a NULL value there
4. The statement that drops the index should be:
SELECT @sql = N'DROP INDEX '+@table+'.'+@index
5. The commit/rollback block should be:
IF @@TRANCOUNT > 0
BEGIN
IF @rollback = 0
COMMIT TRANSACTION
ELSE
ROLLBACK TRANSACTION
END
as you want to commit/rollback only if a transaction has been started.
These are all the things I had to change in order to have the script running properly, according to my testing. I hope this helps others, too, enjoying Andy’s great script !