48

我想描述 SQL Server 2008 中的一个表,就像我们可以DESC在 Oracle 中使用该命令一样。

我有[EX].[dbo].[EMP_MAST]我想描述的表,但它不起作用。

显示错误:

对象“EMP_MAST”在数据库“master”中不存在或对该操作无效。

4

8 回答 8

87

您可以使用sp_columns,这是一个用于描述表的系统存储过程。

exec sp_columns TableName

您也可以使用sp_help

于 2012-06-18T07:00:05.247 回答
41

根据此文档

DESC MY_TABLE

相当于

SELECT column_name "Name", nullable "Null?", concat(concat(concat(data_type,'('),data_length),')') "Type" FROM user_tab_columns WHERE table_name='TABLE_NAME_TO_DESCRIBE';

我已经为您粗略地将其翻译为 SQL Server 等效项 - 只要确保您在EX数据库上运行它即可。

SELECT column_name AS [name],
       IS_NULLABLE AS [null?],
       DATA_TYPE + COALESCE('(' + CASE WHEN CHARACTER_MAXIMUM_LENGTH = -1
                                  THEN 'Max'
                                  ELSE CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR(5))
                                  END + ')', '') AS [type]
FROM   INFORMATION_SCHEMA.Columns
WHERE  table_name = 'EMP_MAST'
于 2012-06-18T11:45:00.403 回答
30

sp_help 内置过程是 SQL Server 最接近 Oracle 的 DESC 函数恕我直言

sp_help MyTable

采用

sp_help "[SchemaName].[TableName]" 

或者

sp_help "[InstanceName].[SchemaName].[TableName]"

如果您需要进一步限定表名

于 2014-02-12T17:01:20.613 回答
8

这可能会有所帮助:

Use MyTest
Go
select * from information_schema.COLUMNS where TABLE_NAME='employee'

{ where: MyTest= DatabaseName Employee= TableName } --可选条件

于 2013-08-11T16:03:47.467 回答
8

您可以使用键盘快捷键来获取表格中的描述/详细信息SQL Server 2008

遵循以下步骤:

  1. 写表名,
  2. 选择它,然后按Alt + F1
  3. 它将显示上述表格的详细信息/描述,

    1)表创建日期,
    2)列描述,
    3)身份,
    4)索引,
    5)约束,
    6)参考等。如下图所示[示例]:

Alt+F1 演示

于 2016-07-11T05:52:28.797 回答
6

我喜欢尝试进行翻译的答案,但是,在使用代码时它不喜欢不是 VARCHAR 类型的列,例如 BIGINT 或 DATETIME。我今天需要类似的东西,所以我花时间根据自己的喜好对其进行修改。它现在也被封装在一个函数中,这是我能找到的最接近于在 oracle 处理它时键入描述的东西。我的案例陈述中可能仍然缺少一些数据类型,但这适用于我尝试过的所有内容。它还按序号位置排序。这也可以扩展为轻松包含主键列。

CREATE FUNCTION dbo.describe (@TABLENAME varchar(50))
returns table
as
RETURN
(
SELECT TOP 1000 column_name AS [ColumnName],
       IS_NULLABLE AS [IsNullable],
       DATA_TYPE + '(' + CASE 
                                    WHEN DATA_TYPE = 'varchar' or DATA_TYPE = 'char' THEN 
                                      CASE 
                                        WHEN Cast(CHARACTER_MAXIMUM_LENGTH AS VARCHAR(5)) = -1 THEN 'Max'
                                        ELSE Cast(CHARACTER_MAXIMUM_LENGTH AS VARCHAR(5))
                                      END
                                    WHEN DATA_TYPE = 'decimal' or DATA_TYPE = 'numeric' THEN
                                      Cast(NUMERIC_PRECISION AS VARCHAR(5))+', '+Cast(NUMERIC_SCALE AS VARCHAR(5))
                                    WHEN DATA_TYPE = 'bigint' or DATA_TYPE = 'int' THEN
                                      Cast(NUMERIC_PRECISION AS VARCHAR(5))
                                    ELSE ''
                                  END + ')' AS [DataType]
FROM   INFORMATION_SCHEMA.Columns
WHERE  table_name = @TABLENAME
order by ordinal_Position
);
GO

一旦你在这里创建函数是我使用的示例表

create table dbo.yourtable
(columna bigint,
 columnb int,
 columnc datetime,
 columnd varchar(100),
 columne char(10),
 columnf bit,
 columng numeric(10,2),
 columnh decimal(10,2)
 )

然后可以如下执行

select * from describe ('yourtable')

它返回以下内容

ColumnName IsNullable 数据类型


columna NO bigint(19)
columnb NO int(10)
columnc NO datetime() columnd
NO varchar(100)
columne NO char(10)
columnf NO bit()
columng NO numeric(10, 2)
columnh NO decimal(10, 2)

希望这可以帮助某人。

于 2013-10-03T16:06:41.213 回答
2

作为 Bridge 答案的变体(我还没有足够的代表发表评论,并且对编辑该答案感觉不正确),这是一个更适合我的版本。

SELECT column_name AS [Name],
   IS_NULLABLE AS [Null?],
   DATA_TYPE + CASE
                 WHEN CHARACTER_MAXIMUM_LENGTH IS NULL THEN ''
                 WHEN CHARACTER_MAXIMUM_LENGTH > 99999 THEN ''
                 ELSE '(' + Cast(CHARACTER_MAXIMUM_LENGTH AS VARCHAR(5)) + ')' 
               END AS [Type]
FROM   INFORMATION_SCHEMA.Columns
WHERE  table_name = 'table_name'

显着变化:

  • 适用于没有长度的类型。对于 int 列,我看到类型为 NULL,因为长度为 null 并且它清除了整个 Type 列。所以不要打印任何长度分量(或括号)。
  • 将检查CAST长度更改为 -1 以检查实际长度。我收到语法错误,因为大小写导致“*”而不是 -1。执行算术检查似乎比 CAST 溢出更有意义。
  • 非常长时不要打印长度(任意 > 5 位)。
于 2014-03-19T15:48:28.860 回答
2

只需输入以下行。

exec sp_help [table_name]
于 2016-04-26T17:27:51.593 回答