SQL 服务器索引 - 验证命名约定
SQL Server Indexes - verify naming convention
我正在寻找一个 T-SQL 脚本,它可以验证我的索引是否正确命名。
PK_ for primary keys
UK_ for unique keys
IX_ for non clustered non unique indexes
UX_ for unique indexes
此外,索引的命名(棘手的部分):
IX_Column1_Column2 - instead of IX_CrazyIndexWhichFixesPerformance
有人使用这种类型的脚本吗?
使用对象目录视图 (sys.*) 很容易完成。
这取决于您想如何处理这个问题 - 您可以编写一个完整的程序来检查所有这些事情。我没有可以完全执行上述操作的代码,但这应该会让您走上正确的轨道。
对于主键检查,您可以找到不符合您的命名方案的主键:
SELECT distinct
i.name AS index_name,
i.object_id
from
sys.indexes i
where
i.is_primary_key = 1
and i.name not like 'PK_%'
这将是使用 sys.objects
table 过滤特定键约束的问题。
对于列,通过 sys.index_columns
和 sys.columns
连接:
SELECT distinct
c.name AS column_name,
i.name AS index_name,
i.object_id
from
sys.indexes i
inner join sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
inner join sys.columns c ON ic.object_id = c.object_id AND c.column_id = ic.column_id
由于您希望将列名连接到一个字段中,因此您需要查看
这些信息加上仔细操作您需要的命名约定应该允许您执行这些检查。
我最终得到了这个 - 它可能不是很漂亮,但现在完成了工作:-)
WITH indexesCTE
AS
(
SELECT
t.name AS TableName
, i.name AS IndexName
, i.index_id AS IndexId
, ic.index_column_id AS ColumnId
, t.object_id AS TableId
, REPLACE(c.name, '_', '') AS ColumnName
, i.object_id AS IndexObjectId
FROM sys.indexes i
INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id and i.index_id = ic.index_id
INNER JOIN sys.columns c ON ic.object_id = c.object_id and ic.column_id = c.column_id
INNER JOIN sys.tables t ON i.object_id = t.object_id
WHERE
i.is_primary_key = 0
AND i.is_unique = 0
AND i.is_unique_constraint = 0
AND t.is_ms_shipped = 0
)
, indexNameProposal
AS
(
SELECT i.TableName
, i.IndexName AS CurrentIndexName
, 'IX' + STUFF((SELECT '_' + i2.ColumnName FROM indexesCTE i2 WHERE i2.IndexId = i.IndexId AND i.TableId = i2.TableId FOR XML PATH('')),1,0,'') AS IndexNameProposal
FROM indexesCTE i
GROUP BY i.TableName, i.IndexName, i.TableId, i.IndexId
)
SELECT
*
FROM indexNameProposal i
WHERE i.CurrentIndexName <> i.IndexNameProposal
我正在寻找一个 T-SQL 脚本,它可以验证我的索引是否正确命名。
PK_ for primary keys
UK_ for unique keys
IX_ for non clustered non unique indexes
UX_ for unique indexes
此外,索引的命名(棘手的部分):
IX_Column1_Column2 - instead of IX_CrazyIndexWhichFixesPerformance
有人使用这种类型的脚本吗?
使用对象目录视图 (sys.*) 很容易完成。
这取决于您想如何处理这个问题 - 您可以编写一个完整的程序来检查所有这些事情。我没有可以完全执行上述操作的代码,但这应该会让您走上正确的轨道。
对于主键检查,您可以找到不符合您的命名方案的主键:
SELECT distinct
i.name AS index_name,
i.object_id
from
sys.indexes i
where
i.is_primary_key = 1
and i.name not like 'PK_%'
这将是使用 sys.objects
table 过滤特定键约束的问题。
对于列,通过 sys.index_columns
和 sys.columns
连接:
SELECT distinct
c.name AS column_name,
i.name AS index_name,
i.object_id
from
sys.indexes i
inner join sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
inner join sys.columns c ON ic.object_id = c.object_id AND c.column_id = ic.column_id
由于您希望将列名连接到一个字段中,因此您需要查看
这些信息加上仔细操作您需要的命名约定应该允许您执行这些检查。
我最终得到了这个 - 它可能不是很漂亮,但现在完成了工作:-)
WITH indexesCTE
AS
(
SELECT
t.name AS TableName
, i.name AS IndexName
, i.index_id AS IndexId
, ic.index_column_id AS ColumnId
, t.object_id AS TableId
, REPLACE(c.name, '_', '') AS ColumnName
, i.object_id AS IndexObjectId
FROM sys.indexes i
INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id and i.index_id = ic.index_id
INNER JOIN sys.columns c ON ic.object_id = c.object_id and ic.column_id = c.column_id
INNER JOIN sys.tables t ON i.object_id = t.object_id
WHERE
i.is_primary_key = 0
AND i.is_unique = 0
AND i.is_unique_constraint = 0
AND t.is_ms_shipped = 0
)
, indexNameProposal
AS
(
SELECT i.TableName
, i.IndexName AS CurrentIndexName
, 'IX' + STUFF((SELECT '_' + i2.ColumnName FROM indexesCTE i2 WHERE i2.IndexId = i.IndexId AND i.TableId = i2.TableId FOR XML PATH('')),1,0,'') AS IndexNameProposal
FROM indexesCTE i
GROUP BY i.TableName, i.IndexName, i.TableId, i.IndexId
)
SELECT
*
FROM indexNameProposal i
WHERE i.CurrentIndexName <> i.IndexNameProposal