Lie*_*oen 269 sql-server
像这样的东西:
SELECT
*
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'
Run Code Online (Sandbox Code Playgroud)
但对于索引.
Ada*_*Dev 450
你可以使用这样的直接选择来做到这一点:
SELECT *
FROM sys.indexes
WHERE name='YourIndexName' AND object_id = OBJECT_ID('Schema.YourTableName')
Run Code Online (Sandbox Code Playgroud)
Mr *_*Goo 87
编码方式,检测索引存在的更简洁的方法如下;
If IndexProperty(Object_Id('MyTable'), 'MyIndex', 'IndexId') Is Null
Run Code Online (Sandbox Code Playgroud)
如果索引存在,IndexProperty将返回一个Id,如果不存在,则不会.
小智 70
AdaTheDEV,我使用了你的语法并创建了以下内容和原因.
问题:由于缺少索引,流程每季度运行一次,耗时一小时.
更正:更改查询过程或过程以检查索引并在缺少时创建它...在查询和过程结束时放置相同的代码以删除索引,因为它不是必需的,而是每季度.此处仅显示删除语法
-- 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
Run Code Online (Sandbox Code Playgroud)
Chr*_*ord 14
然而,与原始问题的轻微偏差可能对将来登陆此处的DROP人和CREATE索引(即在部署脚本中)有用.
只需将以下内容添加到create语句中即可绕过exists检查:
CREATE INDEX IX_IndexName
ON dbo.TableName
WITH (DROP_EXISTING = ON);
Run Code Online (Sandbox Code Playgroud)
在这里阅读更多内容:CREATE INDEX(Transact-SQL) - DROP_EXISTING子句
NB正如注释中所提到的,索引必须已经存在才能使该子句工作而不会抛出错误.
写下面的函数,让我快速检查索引是否存在; 就像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
Run Code Online (Sandbox Code Playgroud)
编辑:这只返回表的OBJECT_ID,但如果索引不存在则为NULL.我想你可以设置它来返回index_id,但这不是非常有用.
如果您的问题的隐藏目的是DROP在创建INSERT大型表之前先建立索引,则这很有用:
DROP INDEX IF EXISTS [IndexName] ON [dbo].[TableName]
Run Code Online (Sandbox Code Playgroud)
这句法是因为SQL服务器2016文档可用IF EXISTS:
如果您使用的是入门密钥,请使用以下命令:
ALTER TABLE [TableName] DROP CONSTRAINT IF EXISTS [PK_name]
Run Code Online (Sandbox Code Playgroud)