T-SQL查询显示表定义?


105

什么是查询可以向我显示完整的定义,包括SQL Server表的索引和键?我想要一个纯查询-并且知道SQL Studio可以提供给我,但是我经常在“野生”计算机上,这些计算机只有最简单的应用程序,并且我无权安装Studio。但是SQLCMD始终是一个选择。

更新:我已经尝试了sp_help,但是只产生一条记录,显示名称,所有者,类型和Created_Datetime。我还缺少sp_help吗?

这就是我所说的:

sp_help机场

请注意,我确实希望使用定义表的DDL。


1
您缺少的sp_help是它返回多个结果集。您正在描述第一个结果集返回的列。
Joe Stefanelli

1
好问题。来自MySQL的解决方案太短了,因为一个地方看不到列,索引,外键,约束名称。当对象浏览器中有许多数据库/表时,这种情况很严重。希望微软将来能解决这个问题。我没有使用任何生产力工具,但SSMSBoost看起来很有希望。
彼得

1
@Microsoft,请像MySQL一样添加DESC TABLE。简单。简单。做完了
皮特·阿尔文,

Answers:


127

没有简单的方法可以返回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')

1
谢谢。我开始怀疑,要做到这一点的唯一方法是查询多个单独的表,并且当您告诉它“生成DDL”时,这就是SQL Studio所做的。我很惊讶,但是没有通用的SP可以为您做到。
Daniel Williams

6
它是。如果只需要列信息,则可以sp_columns按照答案中的说明执行。如果您想要有关FK的信息,请运行sp_fkeys。如果您想知道索引,请执行sp_statistics

69

您是否尝试过sp_help?

sp_help 'TableName'

1
这显示了结构,约束,约束类型等。需要注意的一件事:您必须写出数据表的全名。Schema.TableName。否则,它将完全解决问题并提供有关表的所有信息。
FrenkyB 2015年

1
即使已写入完整路径,也不返回表的DDL。
CoveGeek'2

25

请访问http://www.stormrage.com/SQLStuff/sp_GetDDL_Latest.txt

您将找到的代码 sp_getddl SQL Server过程。该过程的目的是为任何表,临时表或对象编写脚本。

用法:

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)。


感谢您的脚本和分享!我想问一下,您是否有帖子可以讨论此脚本?
贝拉什

优秀的!MSFT必须在Management Studio中具有这样的功能
Tertium


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);
        }
    }
}

2
但是,这不是T-SQL
ivan_pozdeev 2014年

我不知道如果使用SQL事件探查器捕获此启动的命令,将会看到什么。:->
Paul Smith

只是想补充一点,这不会脚本出来,因为它是目前不支持SMO任何CDC表:(。
H.亚伯拉罕查韦斯

我添加了一个带有PowerShell端口的答案。希望这对某人有帮助。
R. Horber


6

这将返回表上定义的列,数据类型和索引:

--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') 


4

只需键入表名称并选择它,然后按ATL + F1

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

它将显示表的完整定义。


好一个))但是对我来说,它显示了整个数据库的数据。我尝试了仅带有表名的新查询窗口,但它不起作用-它始终显示所有内容。否则,不错的提示:)
FrenkyB 2015年

我在2008年和2012年使用过它,不确定较旧的版本,并且它始终对我有用,如果要使用架构,则仅使用表名和ALT + F1,然后使用“ schema.table”。
Ali Adravi'3

这是sp_help'schema.tablename'的快捷方式
Ali Adravi

2
当我选择\突出显示表名时有效。如果查询窗口中没有其他内容,则显示整个数据库。
DB Tech

3

@Anthony Faull对于使用LINQPad的用户的答案的变体:

new Server(new ServerConnection(this.Connection.DataSource))
    .Databases[this.Connection.Database]
    .Tables["<table>", "dbo"]
    ?.Script(new ScriptingOptions {
        SchemaQualify = true,
        DriAll = true,
    })

您需要引用2个程序集:

  • Microsoft.SqlServer.ConnectionInfo.dll
  • Microsoft.SqlServer.Smo.dll

并按Anthony的代码片段所述添加名称空间引用。


3

我知道这是一个老问题,但正是我想要的。因为我想批处理某些表的脚本,所以我重写了Anthony Faull的PowerShell的C#代码。

这是使用集成安全性:

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"}


2

作为Barry答案的补充。sp_help也可以单独用于迭代特定数据库中的所有对象。您的军械库还具有sp_helptext,用于编写程序元素(例如存储过程)的脚本。


2

另一种方法是执行sp_columns过程。

EXEC sys.sp_columns @TABLE_NAME = 'YourTableName'


-5

“请注意,我确实希望使用定义表的DDL。”

使用pg_dump:

pg_dump -s -t tablename dbname

它以纯SQL的形式为您提供数据库中-s某个表(-ttablename)的表定义(仅架构,无数据)"dbname"。此外,您还将获得序列,主键和约束信息。您可以输出的输出-可能是在根据需要进行检查和编辑之后-再次输入到(相同或另一个)Postgres数据库中:

pg_dump -s -t tablename dbname1  > /tmp/foo.sql
psql -e dbname2 < /tmp/foo.sql

这是用于UNIX / Linux,但是我敢肯定,对于Windows也存在pg_dump。


1
没有!这是给postgres的,而不是给Microsoft SQL Server的。
2015年

3
忽略问题中指定的整个平台和数据库引擎。真好
杰里米
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.