Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server展平数据-获取有关表和架构的数据_Sql_Sql Server - Fatal编程技术网

SQL Server展平数据-获取有关表和架构的数据

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

我试图获取关于特定给定模式和表名的数据。我需要的信息是列名、数据类型、是否可为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 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_位置,以使其正确运行——但这让我开始了。谢谢对不起,我犯了战术错误。我很高兴它成功了。