このようなもの:
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'
しかし、インデックス用です。
回答:
次のような単純な選択を使用してそれを行うことができます:
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、私はあなたの構文を使用して、以下とその理由を作成しました。
問題:インデックスが欠落しているため、プロセスは四半期に1回実行され、1時間かかります。
修正:クエリプロセスまたはプロシージャを変更してインデックスをチェックし、欠落している場合は作成する...同じコードがクエリの最後に配置され、インデックスは削除されます。ここにドロップ構文のみを表示
-- 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 Serverの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')