删除列上的约束(索引)

use*_*480 12 sql-server constraint scripting alter-table

如何修改带有索引的表的类型?我试图在一个空表上做一个改变列来修改从日期时间到 varchar(15) 的类型,并得到错误说它依赖于列(结果是索引)。

通过右键单击索引并编写 drop 脚本,我能够在本地轻松解决此问题,但是我需要在无法访问索引名称的其他服务器上推出此功能。

有没有办法制作一个可以删除任何索引的脚本,让我在列上更改数据类型然后读取索引?谢谢!

Nic*_*ico 7

您可以使用 sys.indexes 视图来获取索引。您可以将此表加入 sys.tables、sys.columns 和 sys.index_column 以获取信息以创建动态删除索引。您可以使用这个简单的选择来生成放置索引。您可以使用 where 子句来过滤表和列。如果要更改 Table1.Column1,则必须使用这些名称来过滤选择以获得正确的删除语句

use [testdb]
go
declare @sqlDropIndex NVARCHAR(1000)

select @sqlDropIndex = 'DROP INDEX ' + idx.name + ' ON ' + tbl.name
from sys.indexes idx inner join 
        sys.tables tbl on idx.object_id = tbl.object_id inner join
        sys.index_columns idxCol on idx.index_id = idxCol.index_id inner join
        sys.columns col on idxCol.column_id = col.column_id
where idx.type <> 0 and
        tbl.name = 'MyTableName' and
        col.name = 'MyColumnName'
group by idx.name, tbl.name
order by idx.name desc

print @sqlDropIndex
--exec sp_executeSql @sqlDropIndex
go
Run Code Online (Sandbox Code Playgroud)

希望能帮到你

  • 加入时,您必须使用 idx.object_id = idxCol.object_id &amp; idxCol.object_id = col.object_id 来丰富 join 语句,并且不需要分组。 (3认同)