SQL Server展平数据-获取有关表和架构的数据
我试图获取关于特定给定模式和表名的数据。我需要的信息是列名、数据类型、是否可为null,以及它是外键还是主键。我已接近以下查询:SQL Server展平数据-获取有关表和架构的数据,sql,sql-server,Sql,Sql Server,我试图获取关于特定给定模式和表名的数据。我需要的信息是列名、数据类型、是否可为null,以及它是外键还是主键。我已接近以下查询: SELECT C.COLUMN_NAME, C.DATA_TYPE, C.IS_NULLABLE, CASE WHEN Z.CONSTRAINT_TYPE = 'PRIMARY KEY' THEN 1 ELSE 0 END AS IS_PRIMARY_KEY, CASE WHEN Z.CONSTRAINT_TYPE = 'FOREIGN KEY' THEN 1 EL
SELECT C.COLUMN_NAME, C.DATA_TYPE, C.IS_NULLABLE, CASE WHEN Z.CONSTRAINT_TYPE = 'PRIMARY KEY' THEN 1 ELSE 0 END AS IS_PRIMARY_KEY,
CASE WHEN Z.CONSTRAINT_TYPE = 'FOREIGN KEY' THEN 1 ELSE 0 END AS IS_FOREIGN_KEY
FROM INFORMATION_SCHEMA.COLUMNS As C
OUTER APPLY
(SELECT TC.CONSTRAINT_NAME, TC.CONSTRAINT_TYPE FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE As CCU ON CCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
WHERE TC.TABLE_SCHEMA = C.TABLE_SCHEMA AND TC.TABLE_NAME = C.TABLE_NAME
AND (TC.CONSTRAINT_TYPE = 'PRIMARY KEY' or TC.CONSTRAINT_TYPE = 'FOREIGN KEY')
AND CCU.COLUMN_NAME = C.COLUMN_NAME)
AS Z
WHERE C.TABLE_NAME = 'ProductExpert'
AND C.TABLE_SCHEMA = 'Learning' ORDER BY C.ORDINAL_POSITION
这收集了我需要的数据,但它不是“扁平化”的。请参见结果图像:
理想情况下,我需要的是每列列出一次。在本例中,ProductId和OrganizationExpertId将使用1 In IS_PRIMARY_键和IS_FOREIGN_键列出一次。我仍然希望ExpertRoles返回值中的两个角色都是0。这是因为join语法。您需要按以下方式更改联接:
SELECT
C.COLUMN_NAME,
C.DATA_TYPE,
C.IS_NULLABLE,
CASE WHEN PKEY.CONSTRAINT_NAME IS NULL THEN 0 ELSE 1 END AS IS_PRIMARY_KEY,
CASE WHEN Z.CONSTRAINT_TYPE IS NULL THEN 0 ELSE 1 END AS IS_FOREIGN_KEY
FROM INFORMATION_SCHEMA.COLUMNS As C
LEFT OUTER JOIN
(SELECT TC.CONSTRAINT_NAME, TC.CONSTRAINT_TYPE FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE As CCU ON CCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
WHERE TC.TABLE_SCHEMA = C.TABLE_SCHEMA AND TC.TABLE_NAME = C.TABLE_NAME
AND (TC.CONSTRAINT_TYPE = 'PRIMARY KEY' or TC.CONSTRAINT_TYPE = 'FOREIGN KEY')
AND CCU.COLUMN_NAME = C.COLUMN_NAME)
AS PKEY
ON Z.CONSTRAINT_TYPE = 'PRIMARY KEY'
LEFT OUTER JOIN
(SELECT TC.CONSTRAINT_NAME, TC.CONSTRAINT_TYPE FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE As CCU ON CCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
WHERE TC.TABLE_SCHEMA = C.TABLE_SCHEMA AND TC.TABLE_NAME = C.TABLE_NAME
AND (TC.CONSTRAINT_TYPE = 'PRIMARY KEY' or TC.CONSTRAINT_TYPE = 'FOREIGN KEY')
AND CCU.COLUMN_NAME = C.COLUMN_NAME)
AS FKEY
ON Z.CONSTRAINT_TYPE = 'FOREIGN KEY'
WHERE C.TABLE_NAME = 'ProductExpert'
AND C.TABLE_SCHEMA = 'Learning'
ORDER BY C.ORDINAL_POSITION
或者,您也可以将max与group by一起使用
SELECT C.COLUMN_NAME, C.DATA_TYPE, C.IS_NULLABLE, max(CASE WHEN Z.CONSTRAINT_TYPE = 'PRIMARY KEY' THEN 1 ELSE 0 END) AS IS_PRIMARY_KEY,
max(CASE WHEN Z.CONSTRAINT_TYPE = 'FOREIGN KEY' THEN 1 ELSE 0 END) AS IS_FOREIGN_KEY
FROM INFORMATION_SCHEMA.COLUMNS As C
OUTER APPLY
(SELECT TC.CONSTRAINT_NAME, TC.CONSTRAINT_TYPE FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE As CCU ON CCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
WHERE TC.TABLE_SCHEMA = C.TABLE_SCHEMA AND TC.TABLE_NAME = C.TABLE_NAME
AND (TC.CONSTRAINT_TYPE = 'PRIMARY KEY' or TC.CONSTRAINT_TYPE = 'FOREIGN KEY')
AND CCU.COLUMN_NAME = C.COLUMN_NAME)
AS Z
WHERE C.TABLE_NAME = 'ProductExpert'
AND C.TABLE_SCHEMA = 'Learning'
group by C.COLUMN_NAME, C.DATA_TYPE, C.IS_NULLABLE, C.ORDINAL_POSITION
ORDER BY C.ORDINAL_POSITION
使用
分组方式
处理您知道始终相同的事情。如果出现0和1,则对应为1的对象使用MAX
。您有主键和外键列吗?或者这只是一个例子而不是一个例子。有许多表将主键/外键作为一个列。和Max分组是一个很好的建议。我现在就来处理这个问题。我用了你的第二个例子来处理group by和max。我不得不在group by下移动order by,并在group by中添加C.ORDINAL_位置,以使其正确运行——但这让我开始了。谢谢对不起,我犯了战术错误。我很高兴它成功了。