T-SQL查询以显示表定义?

136
什么查询语句可以显示SQL Server表的完整定义,包括索引和键?我想要一个纯查询 - 我知道SQL Studio可以给我这个,但我经常使用仅有最基本应用程序且没有安装studio权限的“野生”计算机。但是SQLCMD始终是一个选项。
更新:我尝试过sp_help,但它只产生一个记录,显示名称、所有者、类型和创建日期时间。我是否遗漏了其他内容?
以下是我调用的内容:
sp_help airports
请注意,我确实想要定义表的DDL。

2
你在使用 sp_help 时可能忽略了它会返回多个结果集。你所描述的是第一个结果集返回的列。 - Joe Stefanelli
2
好问题。如果来自MySQL,那么解决方案就显得不够完善,因为它无法在一个地方查看所有列、索引、外键和约束名称。当您在对象资源管理器中拥有许多数据库/表时,这是非常严重的。希望Microsoft将来会解决这个问题。我没有使用任何生产力工具,但SSMSBoost看起来很有前途。 - peter n
3
@Microsoft 请添加像MySQL一样的DESC TABLE功能。简单易行,完成即可。 - Pete Alvin
17个回答

151

没有一种简单的方式可以返回DDL。但是你可以从Information Schema ViewsSystem Views中获取大部分细节。

SELECT ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
       , IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Customers'

SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE
WHERE TABLE_NAME = 'Customers'

SELECT name, type_desc, is_unique, is_primary_key
FROM sys.indexes
WHERE [object_id] = OBJECT_ID('dbo.Customers')

2
谢谢。我开始怀疑获取这个的唯一方法是查询多个单独的表格,以及 SQL Studio 在你告诉它“生成 DDL”时所做的事情。我有点惊讶没有通用的存储过程可以为您执行此操作。 - Daniel Williams
7
是的。如果您只想获取列信息,您可以执行我的回答中提到的sp_columns。如果您想获取有关外键的信息,请运行sp_fkeys。如果您想了解索引,请执行sp_statistics - user532231

83

你尝试过使用 sp_help 吗?

sp_help 'TableName'

1
这显示了结构、约束、约束类型等。只需注意一点:必须写出datatable的完整名称。Schema.TableName。否则,它完全解决了问题并提供了有关表的所有信息。 - FrenkyB
3
即使完整路径被写入,也无法返回表的DDL。 - CoveGeek

31

访问http://www.stormrage.com/SQLStuff/sp_GetDDL_Latest.txt,你将找到针对SQL Server的sp_getddl存储过程代码。该存储过程的目的是为了脚本化任何表、临时表或对象。

用法:

exec sp_GetDDL GMACT
或者
exec sp_GetDDL 'bob.example'
或者
exec sp_GetDDL '[schemaname].[tablename]'
或者
exec sp_GetDDL #temp

我在 SQL Server 2012 上测试了它,效果很好。

我不是这个过程的作者。如果您对它进行任何改进,请发送至 Lowell Izaguirre (scripts@stormrage.com)。


谢谢您提供这个脚本并分享!我想问一下,您是否有一个帖子可以让我们讨论这个脚本? - Bellash
太好了!微软一定在管理工具中有这样的功能。 - Tertium
这对我没有起作用,它会给出错误消息,如下所示: Msg 2812,级别16,状态62,行74 找不到存储过程“sp_GetDDL”。 - yuvraj
@yuvraj,这不是一个内置的过程。您需要使用答案中提供的代码自行定义它。 - Sam Krygsheld

20

我能想到最简单和最快的方法是使用sp_help

sp_help '表名'


19

18

使用这个小的Windows命令行应用程序,可以获取任何表格的CREATE TABLE脚本(包括约束条件)。我已经用C#编写了它。只需编译并将其带在内存棒上即可。也许有人可以将其移植到Powershell。

using System;
using System.Linq;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
namespace ViewSource
{
    public class ViewSource
    {
        public static void Main(string[] args)
        {
            if (args.Length != 6)
            {
                Console.Error.WriteLine("Syntax: ViewSource.exe <server>" +
                     " <user> <password> <database> <schema> <table>");
            }

            Script(args[0], args[1], args[2], args[3], args[4], args[5]);
        }
        private static void Script(string server, string user,
            string password, string database, string schema, string table)
        {
            new Server(new ServerConnection(server, user, password))
                .Databases[database]
                .Tables[table, schema]
                .Script(new ScriptingOptions { SchemaQualify = true,
                                               DriAll = true })
                .Cast<string>()
                .Select(s => s + "\n" + "GO")
                .ToList()
                .ForEach(Console.WriteLine);
        }
    }
}

3
这不是T-SQL。 - ivan_pozdeev
我想知道如果你使用SQL Profiler来捕获这个命令,你会看到什么。:-> - Paul Smith
只是想补充一下,这不会脚本化任何CDC表 :( 因为SMO目前不支持它。 - H. Abraham Chavez
我添加了一个使用PowerShell的端口答案。希望这能帮助到某些人。 - R. Horber

11

sp_help 'YourTableName'

7
这将返回表上定义的列、数据类型和索引:
--List all tables in DB
select * from sysobjects where xtype = 'U'

--Table Definition
sp_help TableName

这将返回表上定义的触发器:
--Triggers in SQL Table
select * from sys.triggers where parent_id = object_id(N'SQLTableName') 

7

我知道这是一个老问题,但正是我在寻找的东西。因为我想批处理一些表格,所以我将Anthony Faull的C#代码重新编写成了PowerShell脚本。

下面的代码使用了Integrated Security:

Import-Module sqlps

$serverInstance = "<server>"
$database = "<database>"
$table = "<table>"
$schema = "<schema>"

$options = New-Object -TypeName Microsoft.SqlServer.Management.Smo.ScriptingOptions
$options.DriAll = $true
$options.SchemaQualify = $true

$connection = New-Object -TypeName Microsoft.SqlServer.Management.Common.ServerConnection `
    -ArgumentList $serverInstance
$server = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server `
    -ArgumentList $connection

$server.Databases.Item($database).Tables.Item($table, $schema).Script($options) `
    | ForEach-Object -Process { $_ + "`nGO"}

这里需要输入用户名和密码:

Import-Module sqlps

$serverInstance = "<server>"
$user = "<user>"
$password = "<pasword>"
$database = "<database>"
$table = "<table>"
$schema = "<schema>"

$options = New-Object -TypeName Microsoft.SqlServer.Management.Smo.ScriptingOptions
$options.DriAll = $true
$options.SchemaQualify = $true

$connection = New-Object -TypeName Microsoft.SqlServer.Management.Common.ServerConnection `
    -ArgumentList $serverInstance
$connection.LoginSecure = $false
$connection.Login = $user
$connection.Password = $password
$server = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server `
    -ArgumentList $connection

$server.Databases.Item($database).Tables.Item($table, $schema).Script($options) `
    | ForEach-Object -Process { $_ + "`nGO"}

5

只需输入表名并选择它,然后按下ALT + F1

假设您的表名是Customer,那么打开一个新查询窗口,键入并选择表名,然后按ALT + F1

它将显示表的完整定义。


不错的建议)) 但对我来说,它显示整个数据库的数据。我尝试了只在新查询窗口中输入表名,但它不起作用 - 它总是显示所有内容。否则,很好的提示 :) - FrenkyB
我在2008和2012中使用它,不确定旧版本是否适用,但对我来说总是有效的。只需表名和ALT + F1,如果要使用模式,则为'schema.table'。 - Ali Adravi
1
这是 sp_help 'schema.tablename' 的快捷方式。 - Ali Adravi
2
当我选择\突出显示表名时,它可以工作。如果查询窗口中还有其他内容,则会显示整个数据库。 - DB Tech
那只是让我收到关于辅助功能和屏幕阅读器的信息。 - TextGeek

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