Sesuatu seperti ini:
SELECT
*
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'
tetapi untuk indeks.
Sesuatu seperti ini:
SELECT
*
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'
tetapi untuk indeks.
Jawaban:
Anda dapat melakukannya menggunakan pilihan lurus ke depan seperti ini:
SELECT *
FROM sys.indexes
WHERE name='YourIndexName' AND object_id = OBJECT_ID('Schema.YourTableName')
IF EXISTS(SELECT * ...) BEGIN ... END
.
YourTableName
harus nama lengkap dengan skema
Untuk SQL 2008 dan yang lebih baru , metode yang lebih ringkas, dengan cara pengkodean, untuk mendeteksi keberadaan indeks adalah dengan menggunakan INDEXPROPERTY
fungsi bawaan:
INDEXPROPERTY ( object_ID , index_or_statistics_name , property )
Penggunaan paling sederhana adalah dengan IndexID
properti:
If IndexProperty(Object_Id('MyTable'), 'MyIndex', 'IndexID') Is Null
Jika indeks ada, yang di atas akan mengembalikan ID-nya; jika tidak, itu akan kembali NULL
.
AdaTheDEV, saya menggunakan sintaks Anda dan membuat yang berikut dan mengapa.
Masalah: Proses berjalan sekali seperempat, mengambil satu jam karena indeks yang hilang.
Koreksi: Ubah proses kueri atau Prosedur untuk memeriksa indeks dan membuatnya jika hilang ... Kode yang sama ditempatkan di akhir kueri dan prosedur untuk menghapus indeks karena tidak diperlukan tetapi setiap triwulan. Hanya Menampilkan drop sintaks di sini
-- 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
Namun, sedikit penyimpangan dari pertanyaan awal mungkin berguna bagi orang-orang masa depan yang ingin DROP
dan CREATE
indeks, yaitu dalam skrip penempatan.
Anda dapat memintas pemeriksaan yang ada hanya dengan menambahkan yang berikut ke pernyataan buat Anda:
CREATE INDEX IX_IndexName
ON dbo.TableName
WITH (DROP_EXISTING = ON);
Baca lebih lanjut di sini: CREATE INDEX (Transact-SQL) - DROP_EXISTING Clause
NB Seperti disebutkan dalam komentar, indeks harus sudah ada agar klausa ini berfungsi tanpa menimbulkan kesalahan.
Jika tujuan tersembunyi pertanyaan Anda adalah DROP
indeks sebelum membuat INSERT
ke tabel besar, maka ini berguna satu-liner:
DROP INDEX IF EXISTS [IndexName] ON [dbo].[TableName]
Sintaks ini tersedia sejak SQL Server 2016. Dokumentasi untuk IF EXISTS
:
Jika Anda menggunakan kunci primery, gunakan ini:
ALTER TABLE [TableName] DROP CONSTRAINT IF EXISTS [PK_name]
Tulis fungsi di bawah ini yang memungkinkan saya memeriksa dengan cepat untuk melihat apakah ada indeks; berfungsi seperti 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: Ini hanya mengembalikan OBJECT_ID dari tabel, tetapi itu akan NULL jika indeks tidak ada. Saya kira Anda bisa mengatur ini untuk mengembalikan index_id, tapi itu tidak berguna.
-- 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
Untuk memeriksa Indeks Clustered ada pada tabel tertentu atau tidak:
SELECT * FROM SYS.indexes
WHERE index_id = 1 AND name IN (SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'Table_Name')