SQL Server 查询以获取表中的列列表以及数据类型、NOT NULL 和 PRIMARY KEY 约束
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2418527/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
SQL server query to get the list of columns in a table along with Data types, NOT NULL, and PRIMARY KEY constraints
提问by Shrayas
I need to write a query on SQL server to get the list of columns in a particular table, its associated data types (with length) and if they are not null. And I have managed to do this much.
我需要在 SQL 服务器上编写一个查询以获取特定表中的列列表、其关联的数据类型(带长度)以及它们是否不为空。我已经成功做到了这么多。
But now i also need to get, in the same table, against a column - TRUE
if that column is a primary key.
但是现在我还需要在同一个表中针对一列获取 -TRUE
如果该列是主键。
How do i do this?
我该怎么做呢?
My expected output is:
我的预期输出是:
Column name | Data type | Length | isnull | Pk
回答by marc_s
To avoid duplicate rows for some columns, use user_type_id instead of system_type_id.
为避免某些列出现重复行,请使用 user_type_id 而不是 system_type_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')
Just replace YourTableName
with your actual table name - works for SQL Server 2005 and up.
只需替换YourTableName
为您的实际表名 - 适用于 SQL Server 2005 及更高版本。
In case you are using schemas, replace YourTableName
by YourSchemaName.YourTableName
where YourSchemaName
is the actual schema name and YourTableName
is the actual table name.
如果你正在使用的模式,取代YourTableName
由YourSchemaName.YourTableName
这里YourSchemaName
是实际的架构名称,YourTableName
是实际的表名。
回答by decompiled
The stored procedure sp_columns returns detailed table information.
存储过程 sp_columns 返回详细的表信息。
exec sp_columns MyTable
回答by Ajadex
You could use the query:
您可以使用查询:
select COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH,
NUMERIC_PRECISION, DATETIME_PRECISION,
IS_NULLABLE
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME='TableName'
to get all the metadata you require except for the Pk information.
获取您需要的所有元数据,除了 Pk 信息。
回答by Amruta Kar
In SQL 2012 you can use:
在 SQL 2012 中,您可以使用:
EXEC sp_describe_first_result_set N'SELECT * FROM [TableName]'
This will give you the column names along with their properties.
这将为您提供列名称及其属性。
回答by khaleel
Try this:
尝试这个:
select COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE
from INFORMATION_SCHEMA.COLUMNS IC
where TABLE_NAME = 'tablename' and COLUMN_NAME = 'columnname'
回答by Microsoft Developer
To ensure you obtain the right length you would need to consider unicode types as a special case. See code below.
为了确保您获得正确的长度,您需要将 unicode 类型视为一种特殊情况。请参阅下面的代码。
For further information see: https://msdn.microsoft.com/en-us/library/ms176106.aspx
有关更多信息,请参阅:https: //msdn.microsoft.com/en-us/library/ms176106.aspx
SELECT
c.name 'Column Name',
t.name,
t.name +
CASE WHEN t.name IN ('char', 'varchar','nchar','nvarchar') THEN '('+
CASE WHEN c.max_length=-1 THEN 'MAX'
ELSE CONVERT(VARCHAR(4),
CASE WHEN t.name IN ('nchar','nvarchar')
THEN c.max_length/2 ELSE c.max_length END )
END +')'
WHEN t.name IN ('decimal','numeric')
THEN '('+ CONVERT(VARCHAR(4),c.precision)+','
+ CONVERT(VARCHAR(4),c.Scale)+')'
ELSE '' END
as "DDL name",
c.max_length 'Max Length in Bytes',
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')
回答by Thomas
Expanding on Alex's answer, you can do this to get the PK constraint
扩展亚历克斯的答案,您可以这样做以获得 PK 约束
Select C.COLUMN_NAME, C.DATA_TYPE, C.CHARACTER_MAXIMUM_LENGTH, C.NUMERIC_PRECISION, C.IS_NULLABLE, TC.CONSTRAINT_NAME
From INFORMATION_SCHEMA.COLUMNS As C
Left Join INFORMATION_SCHEMA.TABLE_CONSTRAINTS As TC
On TC.TABLE_SCHEMA = C.TABLE_SCHEMA
And TC.TABLE_NAME = C.TABLE_NAME
And TC.CONSTRAINT_TYPE = 'PRIMARY KEY'
Where C.TABLE_NAME = 'Table'
I must have missed that you want a flag to determine if the given column was part of the PK instead of the name of the PK constraint. For that you would use:
我一定错过了您想要一个标志来确定给定列是否是 PK 的一部分而不是 PK 约束的名称。为此,您将使用:
Select C.COLUMN_NAME, C.DATA_TYPE, C.CHARACTER_MAXIMUM_LENGTH
, C.NUMERIC_PRECISION, C.NUMERIC_SCALE
, C.IS_NULLABLE
, Case When Z.CONSTRAINT_NAME Is Null Then 0 Else 1 End As IsPartOfPrimaryKey
From INFORMATION_SCHEMA.COLUMNS As C
Outer Apply (
Select CCU.CONSTRAINT_NAME
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'
And CCU.COLUMN_NAME = C.COLUMN_NAME
) As Z
Where C.TABLE_NAME = 'Table'
回答by Abu Zafor
wite the table name in the query editor select the name and press Alt+F1 and it will bring all the information of the table.
使用查询编辑器中的表名选择名称并按Alt+F1,它将带来该表的所有信息。
回答by Marquistador
SELECT COLUMN_NAME, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH FROM information_schema.columns WHERE table_name = '<name_of_table_or_view>'
Run SELECT *
in the above statement to see what information_schema.columns returns.
SELECT *
在上面的语句中运行以查看 information_schema.columns 返回什么。
This question has been previously answered - https://stackoverflow.com/a/11268456/6169225
这个问题之前已经回答过 - https://stackoverflow.com/a/11268456/6169225
回答by Mario Levesque
I am a little bit surprised nobody mentioned
我有点惊讶没人提到
sp_help 'mytable'