Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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 获取表的列名vs确定列是否为主键(sql)_Sql Server_Primary Key - Fatal编程技术网

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的用法也考虑了其他键。如果我的答案是确定的,并且可以接受,请接受答案…谢谢,谢谢。您知道我是否要添加其他列来确定字段是否为详细信息,怎么办?请让我们知道“详细信息”到底是什么意思,需要输出的任意一个示例。好的。详细信息是相同的外键。