如何在SQL Server 2008中描述表?

50
我想在SQL Server 2008中描述一张表,就像我们可以使用Oracle中的DESC命令一样。
我有一个名为[EX].[dbo].[EMP_MAST]的表需要描述,但是它不起作用。
错误信息如下:

对象“EMP_MAST”不存在于数据库“master”中,或者对于此操作无效。


3
在执行此操作时,您需要确保在SQL Server Management Studio中选择了正确的数据库 - 您似乎选择了“master”数据库,该数据库中没有这样的表。请注意更换数据库。 - marc_s
@marc_s [EX].[dbo].[EMP_MAST] ..ts 是我的数据库结构... DB NAME _ DBO_TABLENAME.. - Niks
8个回答

88
你可以使用系统存储过程 sp_columns 来描述一个表。
exec sp_columns TableName
你还可以使用 sp_help

1
sp_columns会显示主表结构,如TABLEVIEWER、TABLEOWNER等。 - Niks

41

根据此文档

DESC MY_TABLE

等同于

SELECT column_name "名称", nullable "是否为空?", concat(concat(concat(data_type,'('),data_length),')') "类型" 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'

谢谢,伙计......它运行得很好......非常感谢......但是我有一个关于“sp_columns”的查询,为什么它在这里不能工作? - Niks
3
为什么这里不能运行?运行“exec sp_columns EMP_MAST”应该会返回相同的信息,只是格式不同。你也无法选择从存储过程中返回哪些列! - Bridge

30

在我看来,sp_help内置过程是SQL Server最接近Oracle DESC函数的东西

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

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


1
谢谢你,丹尼尔。你的快速打字和提供的信息量让我选择了它。 - peter n

9
您可以在SQL Server 2008中使用键盘快捷键来查看表的描述/详细信息。
按照以下步骤进行操作:
  1. 输入表名,
  2. 选中它,并按下 Alt + F1 键。
  3. 这将显示所提到的表的详细信息/描述,例如:

    1)表创建日期,
    2)列的描述,
    3)标识,
    4)索引,
    5)约束,
    6)引用等。如下图所示 [示例]:

Alt+F1 Demo


8
也许这可以帮助你:

可能这个会有所帮助:

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

{ where: MyTest= 数据库名 Employee= 表名 } --可选条件


6
我喜欢那个试图翻译的答案,但是在使用代码时,它不能处理不是VARCHAR类型的列,比如BIGINT或DATETIME。今天我需要类似的东西,所以我花时间修改了它,使其更符合我的口味。现在它也被封装在一个函数中,这是我能找到的最接近于只键入Oracle处理描述的东西。在我的case语句中可能仍然缺少一些数据类型,但对我尝试过的所有内容都有效。它还按位置顺序排序。这也可以很容易地扩展到包括主键列。
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')

它返回以下内容

列名称 是否可空 数据类型


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

希望这能帮助有需要的人。


2

只需输入以下行。

exec sp_help [table_name]

尽管这段代码可能回答了问题,但最好还是包含一些“上下文”来解释它是如何工作的以及何时使用它。仅有代码的答案从长远来看并不有用。 - Benjamin W.
好的。谢谢您的建议。下次会加上上下文。 - Jag

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 列,因为长度为空,整个 Type 列都被清除,因此我看到 null 类型。 因此,请不要打印任何长度组件(或括号)。
  • CAST 长度为 -1 的检查更改为检查实际长度。 由于 CASE 结果为 '*' 而不是 -1,因此我遇到了语法错误。 进行算术检查比从 CAST 中进行溢出更有意义。
  • 非常长时不打印长度(任意> 5 位数)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接