什么是SQL Server中的'describe table'?

299 sql sql-server

我有一个SQL Server数据库,我想知道它有哪些列和类型.我更喜欢通过查询而不是使用像企业管理器这样的GUI来实现这一点.有没有办法做到这一点?

Vin*_*nie 323

您可以使用sp_columns存储过程:

exec sp_columns MyTable
Run Code Online (Sandbox Code Playgroud)

  • 快速说明:不要将表名放在引号中,也不要使用TableOwner.TableName语法. (11认同)
  • 如果您不想使用存储过程,请选择*来自INFORMATION_SCHEMA.COLUMNS其中TABLE_NAME ='TABLENAME' (11认同)
  • 即使使用巨大的终端宽度,sp_columns 的输出在 sqlcmd 中也是难以读取的。下面找到的利用“select”的解决方案更适合 sqlcmd 用户。 (4认同)
  • 谢谢 - 我正准备用 T-SQL 而不是 MSSQL 发布同样的问题。 (2认同)
  • 如果在运行此查询时没有得到任何结果,请参阅 [此处](http://stackoverflow.com/questions/14966329/why-does-sp-columns-return-no-results/1496633)。 (2认同)

Bra*_*non 111

有几种方法可以获取有关表的元数据:

EXEC sp_help tablename
Run Code Online (Sandbox Code Playgroud)

将返回几个结果集,描述表,它的列和约束.

INFORMATION_SCHEMA意见会给你你想要的信息,但不幸的是你要查询的意见,并手动将其加入.

  • 对我而言,它没有"@"字符EXEC sp_help'table_name' (7认同)

Sal*_*007 49

如果你不想使用存储过程,这里是一个简单的查询版本

select * 
  from information_schema.columns 
 where table_name = 'aspnet_Membership'
 order by ordinal_position
Run Code Online (Sandbox Code Playgroud)


Vir*_*lya 32

你可以使用以下

sp_help将 tablename

示例:sp_help客户

或使用快捷方式

  • 选择表格按Alt + F1

示例:客户按Alt + F1


suk*_*khi 29

使用此查询

Select * From INFORMATION_SCHEMA.COLUMNS Where TABLE_NAME = 'TABLENAME'
Run Code Online (Sandbox Code Playgroud)

  • 如果您先说“使用 MyDatabase”,则对我有用。 (2认同)
  • 这个答案与 5 年前的 /sf/answers/22359711/ 没有任何不同。我不认为重复的答案有用。 (2认同)

kin*_*005 15

除了其他答案中显示的方式之外,您还可以使用

SELECT TOP 0 * FROM table_name
Run Code Online (Sandbox Code Playgroud)

这将为您提供每列的名称,但不会产生任何结果,并且几乎可以立即完成,且开销最小.


小智 14

只需选择表格并按Alt+ F1,

它将显示有关表的所有信息,如列名,数据类型,键等.

  • OP要求使用无GUI的方法 (7认同)

Abh*_*eet 14

请使用以下sql查询; 这适用于我的情况.

select * FROM   INFORMATION_SCHEMA.Columns where table_name = 'tablename';
Run Code Online (Sandbox Code Playgroud)

  • 2008 年和 2014 年给出了相同的答案。我认为重复的答案没有用。 (3认同)

Zso*_*asi 7

我在t-sql中编写了一个sql*plus DESC(RIBE),如select(也显示列注释):

USE YourDB
GO

DECLARE @objectName NVARCHAR(128) = 'YourTable';

SELECT
  a.[NAME]
 ,a.[TYPE]
 ,a.[CHARSET]
 ,a.[COLLATION]
 ,a.[NULLABLE]
 ,a.[DEFAULT]
 ,b.[COMMENTS]
-- ,a.[ORDINAL_POSITION]
FROM
  (
    SELECT
      COLUMN_NAME                                     AS [NAME]
     ,CASE DATA_TYPE
        WHEN 'char'       THEN DATA_TYPE  + '(' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + ')'
        WHEN 'numeric'    THEN DATA_TYPE  + '(' + CAST(NUMERIC_PRECISION AS VARCHAR) + ', ' + CAST(NUMERIC_SCALE AS VARCHAR) + ')'
        WHEN 'nvarchar'   THEN DATA_TYPE  + '(' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + ')'
        WHEN 'varbinary'  THEN DATA_TYPE + '(' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + ')'
        WHEN 'varchar'    THEN DATA_TYPE   + '(' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + ')'
        ELSE DATA_TYPE
      END                                             AS [TYPE]
     ,CHARACTER_SET_NAME                              AS [CHARSET]
     ,COLLATION_NAME                                  AS [COLLATION]
     ,IS_NULLABLE                                     AS [NULLABLE]
     ,COLUMN_DEFAULT                                  AS [DEFAULT]
     ,ORDINAL_POSITION
    FROM   
      INFORMATION_SCHEMA.COLUMNS
    WHERE
      TABLE_NAME = @objectName
  ) a
  FULL JOIN
  (
   SELECT
     CAST(value AS NVARCHAR)                        AS [COMMENTS]
    ,CAST(objname AS NVARCHAR)                      AS [NAME]
   FROM
     ::fn_listextendedproperty ('MS_Description', 'user', 'dbo', 'table', @objectName, 'column', default)
  ) b
  ON a.NAME COLLATE YourCollation = b.NAME COLLATE YourCollation
ORDER BY
  a.[ORDINAL_POSITION];
Run Code Online (Sandbox Code Playgroud)

上面提到的select可以在系统标记的存储过程中使用,它可以通过简单的方式从您的实例的任何数据库中调用:

USE master;
GO

IF OBJECT_ID('sp_desc', 'P') IS NOT NULL
  DROP PROCEDURE sp_desc
GO

CREATE PROCEDURE sp_desc (
  @tableName  nvarchar(128)
) AS
BEGIN
  DECLARE @dbName       sysname;
  DECLARE @schemaName   sysname;
  DECLARE @objectName   sysname;
  DECLARE @objectID     int;
  DECLARE @tmpTableName varchar(100);
  DECLARE @sqlCmd       nvarchar(4000);

  SELECT @dbName = PARSENAME(@tableName, 3);
  IF @dbName IS NULL SELECT @dbName = DB_NAME();

  SELECT @schemaName = PARSENAME(@tableName, 2);
  IF @schemaName IS NULL SELECT @schemaName = SCHEMA_NAME();

  SELECT @objectName = PARSENAME(@tableName, 1);
  IF @objectName IS NULL
    BEGIN
      PRINT 'Object is missing from your function call!';
      RETURN;
    END;

  SELECT @objectID = OBJECT_ID(@dbName + '.' + @schemaName + '.' + @objectName);
  IF @objectID IS NULL
    BEGIN
      PRINT 'Object [' + @dbName + '].[' + @schemaName + '].[' + @objectName + '] does not exist!';
      RETURN;
    END;

  SELECT @tmpTableName = '#tmp_DESC_' + CAST(@@SPID AS VARCHAR) + REPLACE(REPLACE(REPLACE(REPLACE(CAST(CONVERT(CHAR, GETDATE(), 121) AS VARCHAR), '-', ''), ' ', ''), ':', ''), '.', '');
  --PRINT @tmpTableName;
  SET @sqlCmd = '
    USE ' + @dbName + '
    CREATE TABLE ' + @tmpTableName + ' (
      [NAME]              nvarchar(128) NOT NULL
     ,[TYPE]              varchar(50)
     ,[CHARSET]           varchar(50)
     ,[COLLATION]         varchar(50)
     ,[NULLABLE]          varchar(3)
     ,[DEFAULT]           nvarchar(4000)
     ,[COMMENTS]          nvarchar(3750));

    INSERT INTO ' + @tmpTableName + '
    SELECT
      a.[NAME]
     ,a.[TYPE]
     ,a.[CHARSET]
     ,a.[COLLATION]
     ,a.[NULLABLE]
     ,a.[DEFAULT]
     ,b.[COMMENTS]
    FROM
      (
        SELECT
          COLUMN_NAME                                     AS [NAME]
         ,CASE DATA_TYPE
            WHEN ''char''      THEN DATA_TYPE + ''('' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + '')''
            WHEN ''numeric''   THEN DATA_TYPE + ''('' + CAST(NUMERIC_PRECISION AS VARCHAR) + '', '' + CAST(NUMERIC_SCALE AS VARCHAR) + '')''
            WHEN ''nvarchar''  THEN DATA_TYPE + ''('' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + '')''
            WHEN ''varbinary'' THEN DATA_TYPE + ''('' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + '')''
            WHEN ''varchar''   THEN DATA_TYPE + ''('' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + '')''
            ELSE DATA_TYPE
          END                                             AS [TYPE]
         ,CHARACTER_SET_NAME                              AS [CHARSET]
         ,COLLATION_NAME                                  AS [COLLATION]
         ,IS_NULLABLE                                     AS [NULLABLE]
         ,COLUMN_DEFAULT                                  AS [DEFAULT]
         ,ORDINAL_POSITION
        FROM   
          INFORMATION_SCHEMA.COLUMNS
        WHERE   
          TABLE_NAME = ''' + @objectName + '''
      ) a
      FULL JOIN
      (
         SELECT
           CAST(value AS NVARCHAR)                        AS [COMMENTS]
          ,CAST(objname AS NVARCHAR)                      AS [NAME]
         FROM
           ::fn_listextendedproperty (''MS_Description'', ''user'', ''' + @schemaName + ''', ''table'', ''' + @objectName + ''', ''column'', default)
      ) b
      ON a.NAME COLLATE Hungarian_CI_AS = b.NAME COLLATE Hungarian_CI_AS
    ORDER BY
      a.[ORDINAL_POSITION];

    SELECT * FROM ' + @tmpTableName + ';'

    --PRINT @sqlCmd;

    EXEC sp_executesql @sqlCmd;
    RETURN;
END;
GO

EXEC sys.sp_MS_marksystemobject sp_desc
GO
Run Code Online (Sandbox Code Playgroud)

要执行过程类型:

EXEC sp_desc 'YourDB.YourSchema.YourTable';
Run Code Online (Sandbox Code Playgroud)

如果要获取描述当前数据库(和模式)的对象简单类型:

EXEC sp_desc 'YourTable';
Run Code Online (Sandbox Code Playgroud)

由于sp_desc是一个系统标记的过程,你甚至可以保留exec命令(不推荐):

sp_desc 'YourTable';
Run Code Online (Sandbox Code Playgroud)


VHS*_*VHS 7

相当于 Oracle 的describe命令的 SQL Server是存储过程sp_help

describe命令为您提供有关列名称、类型、长度等的信息。

在 SQL Server 中,假设您想在数据库 'mydb' 中的架构 'myschema' 中描述一个表 'mytable',您可以执行以下操作:

USE mydb;
exec sp_help 'myschema.mytable';
Run Code Online (Sandbox Code Playgroud)


jiu*_*jiu 6

尝试一下:

EXEC [ServerName].[DatabaseName].dbo.sp_columns 'TableName'
Run Code Online (Sandbox Code Playgroud)

并且可以获得一些表结构信息,例如:

TABLE_QUALIFIER、TABLE_OWNER、TABLE_NAME、COLUMN_NAME、DATA_TYPE、TYPE_NAME...


小智 5

您可以使用sp_help'TableName'


Har*_*_pb 5

除了上述问题之外,如果我们在数据库中有类似的表db_name.dbo.table_name,我们可以使用以下步骤

  1. 与数据库连接

    USE db_name;

  2. 使用EXEC sp_help并且不要忘记输入表名称,就'dbo.tablename'好像您有dboas 架构一样。

    exec sp_help 'dbo.table_name'

这应该有效!