我需要在SQL server上编写一个查询,以获取特定表中的列列表、其关联的数据类型(带长度)以及它们是否不为null.我已经做到了这一点.

但现在,我还需要在同一个表中,针对一列-TRUE,如果该列是主键.

我该怎么做?

我的预期输出是:

Column name | Data type | Length | isnull | Pk

推荐答案

为了避免某些列的行重复,请使用用户类型id而不是系统类型id.

SELECT 
    c.name 'Column Name',
    t.Name 'Data type',
    c.max_length 'Max Length',
    c.precision ,
    c.scale ,
    c.is_nullable,
    ISNULL(i.is_primary_key, 0) 'Primary Key'
FROM    
    sys.columns c
INNER JOIN 
    sys.types t ON c.user_type_id = t.user_type_id
LEFT OUTER JOIN 
    sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
LEFT OUTER JOIN 
    sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
WHERE
    c.object_id = OBJECT_ID('YourTableName')

只需将YourTableName替换为实际的表名即可——适用于SQL Server 2005及更高版本.

如果使用的是模式,请将YourTableName替换为YourSchemaName.YourTableName,其中YourSchemaName是实际的模式名,YourTableName是实际的表名.

Sql相关问答推荐

PostgreSQL集群不间断的数据系列

返回超过16384个字节的列

IS True操作员

为什么Postgrs Planner会在输出部分中显示我在查询中不使用的列?'""

使用sede获取不一定有两个不同标签的所有问题

为什么在这种情况下我不能使用LAG函数?

在SQL中为两个日期之间的每个日期添加行

在迁移到.NET8后,使用Array.Containers的F#查询表达式失败

仅在日期相隔时递增(Oracle SQL)

查找滑动窗口框架中的最大和最小列值

Snowflake 中的分层数据

删除行而不使数据库超载

仅当 SQL Server 中的表为开时,才在存储过程中使用更改跟踪

AdventureWorks 查询

每个ID的SQL返回可能的最低级别及其值

在多个表上递归查找

T-SQL 查询计算日期在其他列中定义的日期之间绑定的行数

如何通过子 Select 在一次更新(并行数组)中多次更新相同的行

PostgreSQL 中的递归树查询

包含多行的 SQL 查询