特定のデータベースのすべての一意のキー制約とインデックスのリストを取得する必要があります。私はこのようなことをしています:
SELECT * FROM sys.sysobjects WHERE type!='u' AND name LIKE <tablename>
これが正しい方法であるかどうかを確認したかっただけですか、それとも同じことを行うためのより良い方法がありますか?
特定のデータベースのすべての一意のキー制約とインデックスのリストを取得する必要があります。私はこのようなことをしています:
SELECT * FROM sys.sysobjects WHERE type!='u' AND name LIKE <tablename>
これが正しい方法であるかどうかを確認したかっただけですか、それとも同じことを行うためのより良い方法がありますか?
一意の制約はインデックスとしてカバーの下に実装されているため、この情報はすべて sys.indexes から直接取得できます。
SELECT
[schema] = OBJECT_SCHEMA_NAME([object_id]),
[table] = OBJECT_NAME([object_id]),
[index] = name,
is_unique_constraint,
is_unique,
is_primary_key
FROM sys.indexes
-- WHERE [object_id] = OBJECT_ID('dbo.tablename');
すべてのデータベースに対して繰り返すには (おそらく特定のテーブルのフィルターなしで):
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += 'SELECT db = ' + name + ',
[schema] = OBJECT_SCHEMA_NAME([object_id]),
[table] = OBJECT_NAME([object_id]),
[index] = name,
is_unique_constraint,
is_unique,
is_primary_key
FROM ' + QUOTENAME(name) + '.sys.indexes;'
FROM sys.databases
WHERE database_id BETWEEN 4 AND 32766;
EXEC sp_executesql @sql;
一意の制約は、タイプ「UQ」によって sys.objects で表されます
select name from sys.objects where type='UQ'
インデックスを取得するには
select i.name, o.name from sys.indexes i
inner join sys.objects o on i.object_id= o.object_id
sys.indexes から一意のキー制約とインデックスを取得できます。具体的には、一意の制約:
select * from sys.indexes where is_unique_constraint = 1