Sql server 获取表的列名vs确定列是否为主键(sql)
我想获得表的所有列,而不是确定字段是否为主键的额外列。我使用以下代码:Sql server 获取表的列名vs确定列是否为主键(sql),sql-server,primary-key,Sql Server,Primary Key,我想获得表的所有列,而不是确定字段是否为主键的额外列。我使用以下代码: SELECT c.column_id ID, c.name ItemName, CASE WHEN tblCon.CONSTRAINT_TYPE = 'PRIMARY KEY' THEN 1 ELSE 0 END ISPK FROM sys.tables tb JOI
SELECT c.column_id ID, c.name ItemName,
CASE
WHEN tblCon.CONSTRAINT_TYPE = 'PRIMARY KEY' THEN 1
ELSE 0
END ISPK
FROM sys.tables tb
JOIN sys.columns c
ON tb.name = 'register'
AND tb.[object_id] = c.[object_id]
JOIN sys.types tp
ON c.user_type_id = tp.user_type_id
LEFT JOIN sys.computed_columns cc
ON c.[object_id] = cc.[object_id]
AND c.column_id = cc.column_id
LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS K
ON c.name = k.COLUMN_NAME
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tblCon
ON tblCon.TABLE_NAME = 'register'
AND tblCon.CONSTRAINT_CATALOG = K.CONSTRAINT_CATALOG
AND tblCon.CONSTRAINT_SCHEMA = K.CONSTRAINT_SCHEMA
AND tblCon.CONSTRAINT_NAME = K.CONSTRAINT_NAME
在本例中,tablename是“register”
此代码正确,但对于主键字段,返回两条记录:
有什么问题吗?这应该行得通
SELECT c.column_id ID, c.name ItemName,
CASE
WHEN tblCon.CONSTRAINT_TYPE = 'PRIMARY KEY' THEN 1
ELSE 0
END ISPK
FROM sys.tables tb
JOIN sys.columns c
ON tb.name = 'register'
AND tb.[object_id] = c.[object_id]
JOIN sys.types tp
ON c.user_type_id = tp.user_type_id
LEFT JOIN sys.computed_columns cc
ON c.[object_id] = cc.[object_id]
AND c.column_id = cc.column_id
LEFT JOIN (select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where CONSTRAINT_NAME like 'PK_%' and TABLE_NAME='register') AS K
ON c.name = k.COLUMN_NAME
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tblCon
ON tblCon.TABLE_NAME = 'register'
AND tblCon.CONSTRAINT_CATALOG = K.CONSTRAINT_CATALOG
AND tblCon.CONSTRAINT_SCHEMA = K.CONSTRAINT_SCHEMA
AND tblCon.CONSTRAINT_NAME = K.CONSTRAINT_NAME
从萨加尔那里得到答案,并将其清理干净。有两个额外的联接,我将子查询更改为左联接,并修改了一些联接条件,因此表名只需输入一次
SELECT c.column_id AS ID
, c.name AS ItemName
, CASE
WHEN tblCon.CONSTRAINT_TYPE = 'PRIMARY KEY' THEN 1
ELSE 0
END AS ISPK
FROM sys.tables tb
JOIN sys.columns c ON
tb.object_id = c.object_id
AND tb.[object_id] = c.[object_id]
LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE K on
CONSTRAINT_NAME like 'PK_%'
and TABLE_NAME = tb.name
AND c.name = k.COLUMN_NAME
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tblCon ON
tblCon.TABLE_NAME = tb.name
AND tblCon.CONSTRAINT_CATALOG = K.CONSTRAINT_CATALOG
AND tblCon.CONSTRAINT_SCHEMA = K.CONSTRAINT_SCHEMA
AND tblCon.CONSTRAINT_NAME = K.CONSTRAINT_NAME
where tb.name = 'register'
添加了一个更多必填列作为详细信息
SELECT c.column_id ID, c.name ItemName,
CASE
WHEN tblCon.CONSTRAINT_TYPE = 'PRIMARY KEY' THEN 1
ELSE 0
END ISPK,
ISNULL(tblCon.CONSTRAINT_TYPE,'') as Detail
FROM sys.tables tb
JOIN sys.columns c
ON tb.name = 'register'
AND tb.[object_id] = c.[object_id]
JOIN sys.types tp
ON c.user_type_id = tp.user_type_id
LEFT JOIN sys.computed_columns cc
ON c.[object_id] = cc.[object_id]
AND c.column_id = cc.column_id
LEFT JOIN (select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where (CONSTRAINT_NAME like 'PK_%' or CONSTRAINT_NAME like 'FK_%') and TABLE_NAME='register') AS K
ON c.name = k.COLUMN_NAME
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tblCon
ON tblCon.TABLE_NAME = 'register'
AND tblCon.CONSTRAINT_CATALOG = K.CONSTRAINT_CATALOG
AND tblCon.CONSTRAINT_SCHEMA = K.CONSTRAINT_SCHEMA
AND tblCon.CONSTRAINT_NAME = K.CONSTRAINT_NAME
原始查询中缺少约束\u名称的条件,因为键\u列\u的用法也考虑了其他键。如果我的答案是确定的,并且可以接受,请接受答案…谢谢,谢谢。您知道我是否要添加其他列来确定字段是否为详细信息,怎么办?请让我们知道“详细信息”到底是什么意思,需要输出的任意一个示例。好的。详细信息是相同的外键。