Sql server 是否获取唯一约束列列表(在TSQL中)?

Sql server 是否获取唯一约束列列表(在TSQL中)?,sql-server,tsql,metadata,constraints,Sql Server,Tsql,Metadata,Constraints,通过以下查询,我可以很容易地获得唯一约束的列表: select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='UNIQUE' 但是如何获得每个唯一约束应用于的列的列表呢?请参见信息\u架构。约束列的用法是正确的,这些列显示在约束列用法视图中,下面是它的SQL select TC.Constraint_Name, CC.Column_Name from information_schema.table_con

通过以下查询,我可以很容易地获得唯一约束的列表:

select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='UNIQUE'

但是如何获得每个唯一约束应用于的列的列表呢?

请参见
信息\u架构。约束列的用法是正确的,这些列显示在约束列用法视图中,下面是它的SQL

select TC.Constraint_Name, CC.Column_Name from information_schema.table_constraints TC
inner join information_schema.constraint_column_usage CC on TC.Constraint_Name = CC.Constraint_Name
where TC.constraint_type = 'Unique'
order by TC.Constraint_Name

仅供mySQL用户参考, 通过以下查询也可以实现同样的效果:

查找表上的任何唯一约束的步骤

select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='UNIQUE' and table_name='db_my_table'
查找包含所有列的唯一列列表

select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where CONSTRAINT_NAME='cons_name' and TABLE_NAME='db_my_table'
查找具有所需视图的唯一列列表

select CONSTRAINT_NAME,COLUMN_NAME,TABLE_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where CONSTRAINT_NAME='cons_name' and TABLE_NAME='db_my_table'
巫术
信息\u SCHEMA.CONSTRAINT\u列\u的使用速度非常慢

使用sys.index,连接表、模式、对象,作为额外的奖励,您不仅可以获得唯一的约束,还可以获得唯一的索引,包括过滤器

-- CREATE TABLE dbo.T_User( USR_ID int NOT NULL, USR_User nvarchar(256) NULL, USR_Status int NOT NULL );
-- ALTER TABLE dbo.T_User ADD CONSTRAINT UC_T_User_USR_User UNIQUE(USR_User)

-- IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.T_User') AND name = N'IX_T_User_USR_User')
-- CREATE UNIQUE INDEX IX_T_User_USR_User ON dbo.T_User(USR_User)
-- WHERE (USR_User IS NOT NULL AND USR_Status=(1))

SELECT 
     sch.name 
    ,st.name 
    ,i.name 
    ,i.has_filter 
    ,i.filter_definition 
    ,i.is_unique 
    ,i.is_primary_key 
    ,i.is_unique_constraint 

    ,CASE WHEN i.is_unique_constraint = 1 
        THEN N'ALTER TABLE ' + QUOTENAME(sch.name) + N'.' + QUOTENAME(st.name) + N' DROP CONSTRAINT ' + QUOTENAME(i.name) + N'; ' 
        ELSE N'DROP INDEX ' + QUOTENAME(i.name)  + N' ON ' + QUOTENAME(sch.name)  + '.' + QUOTENAME(st.name) + '; ' 
    END AS sql 
FROM sys.indexes AS i

INNER JOIN sys.index_columns AS ic 
    ON i.index_id = ic.index_id 
    AND i.object_id = ic.object_id 

INNER JOIN sys.tables AS st 
    ON st.object_id = i.object_id 

INNER JOIN sys.objects AS syso 
    ON syso.object_id = st.object_id 
    AND syso.is_ms_shipped = 0 

INNER JOIN sys.schemas AS sch 
    ON sch.schema_id = st.schema_id 

WHERE (1=1) 
AND NOT EXISTS  
(
    SELECT * 
    FROM sys.extended_properties AS xp 
    WHERE xp.minor_id = 0 
    AND xp.major_id = st.object_id 
    AND xp.name = 'microsoft_database_tools_support' 
)

-- AND sch.name = 'dbo' 
-- AND st.name = 'T_Benutzer'

AND 
(
    i.is_unique_constraint = 1 
    OR 
    (i.is_unique = 1 AND i.is_primary_key = 0)
)
;

下面是一个更好的解决方案,它以适当的排序顺序列出约束列,并添加了ASC/DESC标志。它还允许按目录、模式或表名进行筛选

SELECT sh.name AS schema_name,
   i.name AS constraint_name,
   t.name AS table_name,
   c.name AS column_name,
   ic.key_ordinal AS column_position,
   ic.is_descending_key AS is_desc
FROM sys.indexes i
   INNER JOIN sys.index_columns ic
      ON i.index_id = ic.index_id AND i.object_id = ic.object_id
   INNER JOIN sys.tables AS t 
      ON t.object_id = i.object_id
   INNER JOIN sys.columns c
      ON t.object_id = c.object_id AND ic.column_id = c.column_id
   INNER JOIN sys.objects AS syso 
      ON syso.object_id = t.object_id AND syso.is_ms_shipped = 0 
   INNER JOIN sys.schemas AS sh
      ON sh.schema_id = t.schema_id 
   INNER JOIN information_schema.schemata sch
      ON sch.schema_name = sh.name
WHERE i.is_unique_constraint = 1
   -- AND sch.catalog_name = 'EmployeesQX'
   -- AND sh.name = 'dbo'
ORDER BY sh.name, i.name, ic.key_ordinal;

我使用filter
constraint\u type='check'
来检查约束,例如:
其中TC.constraint\u type='check'和TC.TABLE\u NAME='Roles2016.UsersCRM'和CC.Column\u NAME='State'
不正确,可能在多个列上有唯一的约束。
SELECT sh.name AS schema_name,
   i.name AS constraint_name,
   t.name AS table_name,
   c.name AS column_name,
   ic.key_ordinal AS column_position,
   ic.is_descending_key AS is_desc
FROM sys.indexes i
   INNER JOIN sys.index_columns ic
      ON i.index_id = ic.index_id AND i.object_id = ic.object_id
   INNER JOIN sys.tables AS t 
      ON t.object_id = i.object_id
   INNER JOIN sys.columns c
      ON t.object_id = c.object_id AND ic.column_id = c.column_id
   INNER JOIN sys.objects AS syso 
      ON syso.object_id = t.object_id AND syso.is_ms_shipped = 0 
   INNER JOIN sys.schemas AS sh
      ON sh.schema_id = t.schema_id 
   INNER JOIN information_schema.schemata sch
      ON sch.schema_name = sh.name
WHERE i.is_unique_constraint = 1
   -- AND sch.catalog_name = 'EmployeesQX'
   -- AND sh.name = 'dbo'
ORDER BY sh.name, i.name, ic.key_ordinal;