就像这样:
SELECT
*
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'
但是对于索引。
就像这样:
SELECT
*
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'
但是对于索引。
当前回答
EXEC sp_helpindex '[[[SCHEMA-NAME.TABLE-NAME]]]'
GO
其他回答
AdaTheDEV,我使用了您的语法并创建了以下内容及其原因。
问题:由于缺少索引,进程每季度运行一次,耗时1小时。
纠正:改变查询过程或过程,以检查索引和创建它,如果缺少…同样的代码被放置在查询和过程的末尾,以删除索引,因为它不是需要的,而是每季度需要一次。此处只显示drop语法
-- drop the index
begin
IF EXISTS (SELECT * FROM sys.indexes WHERE name='Index_Name'
AND object_id = OBJECT_ID('[SchmaName].[TableName]'))
begin
DROP INDEX [Index_Name] ON [SchmaName].[TableName];
end
end
如果你的问题的隐藏目的是在INSERT到一个大表之前DROP索引,那么这是有用的一行代码:
DROP INDEX IF EXISTS [IndexName] ON [dbo].[TableName]
此语法自SQL Server 2016以来可用。文件如果存在:
https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/
如果你处理的是一个主键,那么使用这个:
ALTER TABLE [TableName] DROP CONSTRAINT IF EXISTS [PK_name]
查询指定表上是否存在聚集索引。
SELECT * FROM SYS.indexes
WHERE index_id = 1 AND name IN (SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'Table_Name')
EXEC sp_helpindex '[[[SCHEMA-NAME.TABLE-NAME]]]'
GO
然而,与最初的问题稍有偏差,可能会对将来想要DROP和CREATE索引的人有用,即在部署脚本中。
你可以通过在你的create语句中添加以下内容来绕过exists检查:
CREATE INDEX IX_IndexName
ON dbo.TableName
WITH (DROP_EXISTING = ON);
在这里阅读更多:CREATE INDEX (Transact-SQL) - DROP_EXISTING子句
注意:正如注释中提到的,索引必须已经存在,此子句才能正常工作而不抛出错误。