T-SQL查询显示表定义?

时间:2011-06-02 13:52:05

标签: sql-server tsql

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

更新:我尝试过sp_help,但只生成一条显示Name,Owner,Type和Created_Datetime的记录。 sp_help还有其他我缺少的东西吗?

这就是我所说的:

sp_help机场

请注意,我确实需要定义表的DDL。

17 个答案:

答案 0 :(得分:106)

没有简单的方法可以返回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 :(得分:62)

你试过sp_help吗?

sp_help 'TableName'

答案 2 :(得分:20)

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

答案 3 :(得分:19)

使用这个小的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);
        }
    }
}

答案 4 :(得分:15)

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

sp_help 'TableName'

答案 5 :(得分:8)

sp_help 'YourTableName'

答案 6 :(得分: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') 

答案 7 :(得分:3)

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

假设您的表名为Customer,然后打开新查询窗口,输入并选择表名并按ALT + F1

它将显示表的完整定义。

答案 8 :(得分: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的片段中所述。

答案 9 :(得分:3)

从SQL 2012开始,您可以运行以下语句:

Exec sp_describe_first_result_set @tsql= N'Select * from <yourtable>'

如果输入复杂的select语句(连接,子选择等),它将为您提供结果集的定义。如果您需要创建一个新表(或临时表)并且不想手动检查每个字段定义,这非常方便。

https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-describe-first-result-set-transact-sql

答案 10 :(得分:3)

我知道这是一个老问题,但正是我所寻找的。因为我想批量编写一些表脚本,所以我重写了来自Anthony Faull的C#代码,用于PowerShell。

这是使用集成安全性:

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

答案 11 :(得分:2)

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

EXEC sys.sp_columns @TABLE_NAME = 'YourTableName'

答案 12 :(得分:2)

作为巴里答案的补充。 sp_help本身也可以用于迭代特定数据库中的所有对象。你的武器库也有sp_helptext,它编写了程序化元素,如存储过程。

答案 13 :(得分:2)

尝试使用sp_help存储过程。

sp_help&lt;&gt;

答案 14 :(得分:0)

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

答案 15 :(得分:0)

使用存储过程 sp_help 显示通用表定义,如前所述:

<块引用>

sp_help 'table_name_in_current_db_context'

当使用多个上下文的表时,将所需的上下文作为上述命令的前缀很有用,而不是用 use db_xyz 更改它们:

<块引用>

DB_Products..sp_help 'MyTable' -- 用于在 DB_Products 中定义 MyTable

它也适用于临时表:

<块引用>

tempdb..sp_help '#TempTable' -- 用于在当前上下文中定义 #TempTable。

答案 16 :(得分:-4)

&#34;请注意,我确实需要定义表的DDL。&#34;

使用pg_dump:

pg_dump -s -t tablename dbname

它为您提供了表定义(-s仅为架构,无数据) 普通SQL中数据库-t中的某个表("dbname" tablename)。 此外,您将获得序列,主键和约束信息。 根据您的需要检查和编辑后,您可以输出 - 再次喂入(相同或另一个)Postgres数据库:

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

这适用于UNIX / Linux,但我确定,Windows也存在pg_dump。