SQL: 在索引中包含一个新列
SQL: Include a new column in an index
我在 table 中的两行上有一个非聚集索引,其中包含许多列。索引由视图使用,并且视图现在已更新为包含另一列。我通常编写数据库更改脚本,以便它们首先测试更改是否已经应用,这显然意味着例如如果脚本重新运行.
,则不会意外多次添加列
我想通过删除并重新创建新列来将其添加到索引中(除非有一种方法可以在不重新创建索引的情况下包含额外的列)。但我想先测试一下索引是否包含该列。有没有简单的检查方法?
我认为这将提供所有索引的列列表(提供 table 名称、索引名称和列名称)。我相信我得到它们之间的链接是正确的,但请手动检查(例如,在没有列的索引上测试它,然后在有列的索引的新版本上测试)。
然后你可以根据需要添加where clauses/IF EXISTS/etc。
SELECT so.name AS [TableName],
si.name AS [IndexName],
sc.name AS [IndexColumnName]
FROM sys.indexes AS si
INNER JOIN sys.objects AS so ON so.object_id = si.object_id AND is_ms_shipped = 0
INNER JOIN sys.index_columns AS sic ON si.object_id = sic.object_id AND si.index_id = sic.index_id
INNER JOIN sys.columns AS sc ON sic.object_id = sc.object_id AND sic.column_id = sc.column_id
请注意,sys.index_columns
有一个字段 is_included_column
(为 1 或 0),如果需要,您可以使用它来确定它是否是索引的 'included' 部分。
我在 table 中的两行上有一个非聚集索引,其中包含许多列。索引由视图使用,并且视图现在已更新为包含另一列。我通常编写数据库更改脚本,以便它们首先测试更改是否已经应用,这显然意味着例如如果脚本重新运行.
,则不会意外多次添加列我想通过删除并重新创建新列来将其添加到索引中(除非有一种方法可以在不重新创建索引的情况下包含额外的列)。但我想先测试一下索引是否包含该列。有没有简单的检查方法?
我认为这将提供所有索引的列列表(提供 table 名称、索引名称和列名称)。我相信我得到它们之间的链接是正确的,但请手动检查(例如,在没有列的索引上测试它,然后在有列的索引的新版本上测试)。
然后你可以根据需要添加where clauses/IF EXISTS/etc。
SELECT so.name AS [TableName],
si.name AS [IndexName],
sc.name AS [IndexColumnName]
FROM sys.indexes AS si
INNER JOIN sys.objects AS so ON so.object_id = si.object_id AND is_ms_shipped = 0
INNER JOIN sys.index_columns AS sic ON si.object_id = sic.object_id AND si.index_id = sic.index_id
INNER JOIN sys.columns AS sc ON sic.object_id = sc.object_id AND sic.column_id = sc.column_id
请注意,sys.index_columns
有一个字段 is_included_column
(为 1 或 0),如果需要,您可以使用它来确定它是否是索引的 'included' 部分。