像这样:
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'
但是对于索引。
Answers:
您可以使用以下简单选择来做到这一点:
SELECT *
FROM sys.indexes
WHERE name='YourIndexName' AND object_id = OBJECT_ID('Schema.YourTableName')
IF EXISTS(SELECT * ...) BEGIN ... END
。
YourTableName
应使用架构全名
对于SQL 2008及更高版本,一种更简洁的方法(通过编码)可通过使用INDEXPROPERTY
内置函数来检测索引的存在:
INDEXPROPERTY ( object_ID , index_or_statistics_name , property )
最简单的用法是使用IndexID
属性:
If IndexProperty(Object_Id('MyTable'), 'MyIndex', 'IndexID') Is Null
如果索引存在,则上面的将返回其ID;如果没有,它将返回NULL
。
AdaTheDEV,我使用了您的语法并创建了以下内容以及原因。
问题:由于缺少索引,流程每季度运行一次,耗时一个小时。
更正:更改查询过程或过程以检查索引并在丢失时创建索引...在查询和过程的末尾放置了相同的代码以删除索引,因为它不是必需的,而是每季度一次。在这里显示Only 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
从原来的问题略有偏差然而可能被证明为今后人们在这里登陆想要有用DROP
,并CREATE
在部署脚本的景气指数,即。
您只需在create语句中添加以下内容,即可绕过存在检查:
CREATE INDEX IX_IndexName
ON dbo.TableName
WITH (DROP_EXISTING = ON);
在此处阅读更多内容:CREATE INDEX(Transact-SQL)-DROP_EXISTING子句
注意:如注释中所述,索引必须已经存在,此子句才能正常运行而不会引发错误。
如果您的问题的隐藏目的是DROP
在创建INSERT
大型表之前先建立索引,则这很有用:
DROP INDEX IF EXISTS [IndexName] ON [dbo].[TableName]
这句法是因为SQL服务器2016文档可用IF EXISTS
:
如果您使用的是入门密码,请使用此密码:
ALTER TABLE [TableName] DROP CONSTRAINT IF EXISTS [PK_name]
编写了以下功能,使我可以快速检查索引是否存在;就像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
编辑:这只是返回表的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
要检查特定表上是否存在聚集索引:
SELECT * FROM SYS.indexes
WHERE index_id = 1 AND name IN (SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'Table_Name')