就像这样:

SELECT
* 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'

但是对于索引。


当前回答

写了下面的函数,允许我快速检查,看看是否存在索引;就像OBJECT_ID一样。

CREATE FUNCTION INDEX_OBJECT_ID (
    @tableName VARCHAR(128),
    @indexName VARCHAR(128)
    )
RETURNS INT
AS
BEGIN
    DECLARE @objectId INT

    SELECT @objectId = i.object_id
    FROM sys.indexes i
    WHERE i.object_id = OBJECT_ID(@tableName)
    AND i.name = @indexName

    RETURN @objectId
END
GO

EDIT:它只返回表的OBJECT_ID,但如果索引不存在,它将为NULL。我认为您可以将此设置为返回index_id,但这并不是非常有用。

其他回答

-- Delete index if exists
IF EXISTS(SELECT TOP 1 1 FROM sys.indexes indexes INNER JOIN sys.objects 
objects ON indexes.object_id = objects.object_id WHERE indexes.name 
='Your_Index_Name' AND objects.name = 'Your_Table_Name')
BEGIN
    PRINT 'DROP INDEX [Your_Index_Name] ON [dbo].[Your_Table_Name]'
    DROP INDEX [our_Index_Name] ON [dbo].[Your_Table_Name]
END
GO

写了下面的函数,允许我快速检查,看看是否存在索引;就像OBJECT_ID一样。

CREATE FUNCTION INDEX_OBJECT_ID (
    @tableName VARCHAR(128),
    @indexName VARCHAR(128)
    )
RETURNS INT
AS
BEGIN
    DECLARE @objectId INT

    SELECT @objectId = i.object_id
    FROM sys.indexes i
    WHERE i.object_id = OBJECT_ID(@tableName)
    AND i.name = @indexName

    RETURN @objectId
END
GO

EDIT:它只返回表的OBJECT_ID,但如果索引不存在,它将为NULL。我认为您可以将此设置为返回index_id,但这并不是非常有用。

如果你的问题的隐藏目的是在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')

你可以像这样直接选择:

SELECT * 
FROM sys.indexes 
WHERE name='YourIndexName' AND object_id = OBJECT_ID('Schema.YourTableName')