SQL服务器查询以获取表中列的列表以及数据types,NOT NULL和PRIMARY KEY约束

我需要在SQL服务器上编写一个查询来获取特定表中列的列表,关联的数据types及其长度,以及它们是否为空。 我设法做了这么多。 但是现在我还需要在列中使用同一个表 – 如果它是主键,则为TRUE。 我如何做到这一点?

这是输出应该如何:

Columns_name----Data type----Length----isnull----Pk

请帮帮我!

要避免某些列出现重复行,请使用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') 

只需将YourTableNamereplace为实际的表名 – 适用于SQL Server 2005及更高版本。

存储过程sp_columns返回详细的表信息。

 exec sp_columns MyTable 

您可以使用查询:

 select COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, DATETIME_PRECISION, IS_NULLABLE from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='TableName' 

获取除Pk信息外所需的所有元数据。

尝试这个:

 select COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE from INFORMATION_SCHEMA.COLUMNS IC where TABLE_NAME = 'tablename' and COLUMN_NAME = 'columnname' 

为了确保您获得正确的长度,您需要将unicodetypes视为特殊情况。 看下面的代码。

有关更多信息,请参阅: 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') 

在SQL 2012中,您可以使用:

 EXEC sp_describe_first_result_set N'SELECT * FROM [TableName]' 

这会给你列名称及其属性。

扩展Alex的答案,你可以做到这一点,以获得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' 

我一定错过了你想要一个标志来确定给定的列是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' 
 IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Table') BEGIN SELECT COLS.COLUMN_NAME, COLS.DATA_TYPE, COLS.CHARACTER_MAXIMUM_LENGTH, (SELECT 'Yes' FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU ON COLS.TABLE_NAME = TC.TABLE_NAME AND TC.CONSTRAINT_TYPE = 'PRIMARY KEY' AND KCU.TABLE_NAME = TC.TABLE_NAME AND KCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME AND KCU.COLUMN_NAME = COLS.COLUMN_NAME) AS KeyX FROM INFORMATION_SCHEMA.COLUMNS COLS WHERE TABLE_NAME = 'Table' ORDER BY KeyX DESC, COLUMN_NAME END 
 select c.name as [column name], t.name as [type name], tbl.name as [table name] from sys.columns c inner join sys.types t on c.system_type_id = t.system_type_id inner join sys.tables tbl on c.object_id = tbl.object_id where c.object_id = OBJECT_ID('YourTableName1') and t.name like '%YourSearchDataType%' union (select c.name as [column name], t.name as [type name], tbl.name as [table name] from sys.columns c inner join sys.types t on c.system_type_id = t.system_type_id inner join sys.tables tbl on c.object_id = tbl.object_id where c.object_id = OBJECT_ID('YourTableName2') and t.name like '%YourSearchDataType%') union (select c.name as [column name], t.name as [type name], tbl.name as [table name] from sys.columns c inner join sys.types t on c.system_type_id = t.system_type_id inner join sys.tables tbl on c.object_id = tbl.object_id where c.object_id = OBJECT_ID('YourTableName3') and t.name like '%YourSearchDataType%') order by tbl.name 

在一个数据库中根据您的search数据typessearch三个不同表中的哪一列。 这个查询可以扩展到“n”表。

在查询编辑器中input表名并select名称,然后按Alt + F1,它将带来表的所有信息。

把另一个答案扔进戒指,这将给你那些专栏和更多:

 SELECT col.TABLE_CATALOG AS [Database] , col.TABLE_SCHEMA AS Owner , col.TABLE_NAME AS TableName , col.COLUMN_NAME AS ColumnName , col.ORDINAL_POSITION AS OrdinalPosition , col.COLUMN_DEFAULT AS DefaultSetting , col.DATA_TYPE AS DataType , col.CHARACTER_MAXIMUM_LENGTH AS MaxLength , col.DATETIME_PRECISION AS DatePrecision , CAST(CASE col.IS_NULLABLE WHEN 'NO' THEN 0 ELSE 1 END AS bit)AS IsNullable , COLUMNPROPERTY(OBJECT_ID('[' + col.TABLE_SCHEMA + '].[' + col.TABLE_NAME + ']'), col.COLUMN_NAME, 'IsIdentity')AS IsIdentity , COLUMNPROPERTY(OBJECT_ID('[' + col.TABLE_SCHEMA + '].[' + col.TABLE_NAME + ']'), col.COLUMN_NAME, 'IsComputed')AS IsComputed , CAST(ISNULL(pk.is_primary_key, 0)AS bit)AS IsPrimaryKey FROM INFORMATION_SCHEMA.COLUMNS AS col LEFT JOIN(SELECT SCHEMA_NAME(o.schema_id)AS TABLE_SCHEMA , o.name AS TABLE_NAME , c.name AS COLUMN_NAME , i.is_primary_key FROM sys.indexes AS i JOIN sys.index_columns AS ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id JOIN sys.objects AS o ON i.object_id = o.object_id LEFT JOIN sys.columns AS c ON ic.object_id = c.object_id AND c.column_id = ic.column_id WHERE i.is_primary_key = 1)AS pk ON col.TABLE_NAME = pk.TABLE_NAME AND col.TABLE_SCHEMA = pk.TABLE_SCHEMA AND col.COLUMN_NAME = pk.COLUMN_NAME WHERE col.TABLE_NAME = 'YourTableName' AND col.TABLE_SCHEMA = 'dbo' ORDER BY col.TABLE_NAME, col.ORDINAL_POSITION; 
 SELECT T.NAME AS [TABLE NAME] ,C.NAME AS [COLUMN NAME] ,P.NAME AS [DATA TYPE] ,P.MAX_LENGTH AS [Max_SIZE] ,C.[max_length] AS [ActualSizeUsed] ,CAST(P.PRECISION AS VARCHAR) +'/'+ CAST(P.SCALE AS VARCHAR) AS [PRECISION/SCALE] FROM SYS.OBJECTS AS T JOIN SYS.COLUMNS AS C ON T.OBJECT_ID = C.OBJECT_ID JOIN SYS.TYPES AS P ON C.SYSTEM_TYPE_ID = P.SYSTEM_TYPE_ID AND C.[user_type_id] = P.[user_type_id] WHERE T.TYPE_DESC='USER_TABLE' AND T.name = 'InventoryStatus' ORDER BY 2 
 SELECT COLUMN_NAME, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH FROM information_schema.columns WHERE table_name = '<name_of_table_or_view>' 

在上面的语句中运行SELECT *以查看information_schema.columns返回的内容。

这个问题以前已经回答 – https://stackoverflow.com/a/11268456/6169225