获取 SQL 服务器的无冗余约束列表
Get SQL Server's constraints list without redundancy
通过此查询,我获得了我所有数据库的 CHECK
、FOREIGN_KEY
、PRIMARY_KEY
和 UNIQUE_KEY
约束的列表。
SELECT
o.object_id as ID, o.name AS Name,
OBJECT_NAME(o.parent_object_id) AS TableName,
o.type_desc AS TypeName,
cs.COLUMN_NAME as ColumnName
FROM
sys.objects o
LEFT JOIN
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cs ON o.name = cs.CONSTRAINT_NAME
WHERE
o.type = 'C' or o.type = 'F' or o.type = 'PK' or o.type = 'UQ'
但是,其中一些有很多'ColumnName',我想把这个拼接起来。
例如:
'PK_ENTITE_SIGN_DOSSIER_ID_DOSSIER_ID_ENTITE_ID_GROUPE_SIGN_ID_PERSONNE_ID_SCHEMA'
是 table ENTITE_SIGN_DOSSIER
上的 PRIMARY_KEY
,包含 ID_DOSSIER
、ID_ENTITE
、ID_GROUPE_SIGN
、ID_PERSONNE
和 ID_SCHEMA
(5 列),在这种情况下,我的查询 return 此约束的 5 行。
请问如何在查询结果中连接这些列名?
非常感谢您的帮助
这是标准的 xml
和 stuff
函数技巧:
SELECT o.object_id AS ID ,
o.name AS Name ,
OBJECT_NAME(o.parent_object_id) AS TableName ,
o.type_desc AS TypeName ,
ca.ColumnName
FROM sys.objects o
CROSS APPLY ( SELECT STUFF(( SELECT ', ' + cs.COLUMN_NAME
FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cs
WHERE o.name = cs.CONSTRAINT_NAME
FOR
XML PATH('')
), 1, 2, '') AS ColumnName
) ca
WHERE o.type = 'C'
OR o.type = 'F'
OR o.type = 'PK'
OR o.type = 'UQ'
ORDER BY ID
通过此查询,我获得了我所有数据库的 CHECK
、FOREIGN_KEY
、PRIMARY_KEY
和 UNIQUE_KEY
约束的列表。
SELECT
o.object_id as ID, o.name AS Name,
OBJECT_NAME(o.parent_object_id) AS TableName,
o.type_desc AS TypeName,
cs.COLUMN_NAME as ColumnName
FROM
sys.objects o
LEFT JOIN
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cs ON o.name = cs.CONSTRAINT_NAME
WHERE
o.type = 'C' or o.type = 'F' or o.type = 'PK' or o.type = 'UQ'
但是,其中一些有很多'ColumnName',我想把这个拼接起来。
例如:
'PK_ENTITE_SIGN_DOSSIER_ID_DOSSIER_ID_ENTITE_ID_GROUPE_SIGN_ID_PERSONNE_ID_SCHEMA'
是 table ENTITE_SIGN_DOSSIER
上的 PRIMARY_KEY
,包含 ID_DOSSIER
、ID_ENTITE
、ID_GROUPE_SIGN
、ID_PERSONNE
和 ID_SCHEMA
(5 列),在这种情况下,我的查询 return 此约束的 5 行。
请问如何在查询结果中连接这些列名?
非常感谢您的帮助
这是标准的 xml
和 stuff
函数技巧:
SELECT o.object_id AS ID ,
o.name AS Name ,
OBJECT_NAME(o.parent_object_id) AS TableName ,
o.type_desc AS TypeName ,
ca.ColumnName
FROM sys.objects o
CROSS APPLY ( SELECT STUFF(( SELECT ', ' + cs.COLUMN_NAME
FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cs
WHERE o.name = cs.CONSTRAINT_NAME
FOR
XML PATH('')
), 1, 2, '') AS ColumnName
) ca
WHERE o.type = 'C'
OR o.type = 'F'
OR o.type = 'PK'
OR o.type = 'UQ'
ORDER BY ID