【问题标题】:T-SQL query to show table definition?显示表定义的 T-SQL 查询?
【发布时间】:2011-09-07 02:40:49
【问题描述】:

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

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

这就是我所说的:

sp_help 机场

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

【问题讨论】:

  • sp_help 缺少的是它返回多个结果集。您正在描述第一个结果集返回的列。
  • 好问题。来自 MySQL 的解决方案太短了,因为无法在一个地方看到列、索引、外键、约束名称。当您的对象浏览器中有许多数据库/表时,这很严重。希望微软在未来解决这个问题。我没有使用任何生产力工具,但SSMSBoost 看起来很有希望。
  • @Microsoft 请像 MySQL 一样添加 DESC TABLE。简单。简单的。完成。

标签: sql-server tsql


【解决方案1】:

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

【讨论】:

  • 谢谢。我开始怀疑获得此信息的唯一方法是查询多个单独的表,并且当您告诉 SQL Studio“生成 DDL”时,这就是 SQL Studio 所做的。我很惊讶,没有通用的 SP 可以为您做到这一点。
  • 是的。如果您只想要列信息,您可以执行sp_columns,正如我在回答中提到的那样。如果您想了解有关 FK 的信息,请运行 sp_fkeys。如果你想知道索引,执行sp_statistics
【解决方案2】:

您尝试过 sp_help 吗?

sp_help 'TableName'

【讨论】:

  • 这显示了结构、约束、约束类型等。只有一点需要注意:你必须写下数据表的全名。架构.表名。否则,它会完全解决问题并提供有关表的所有信息。
  • 不返回表的 DDL,即使写入了完整路径。
【解决方案3】:

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

【讨论】:

  • 感谢这个脚本和分享!我想问,你有帖子可以讨论这个脚本吗?
  • 太棒了! MSFT 必须在 Management Studio 中有这样的功能
  • 这对我不起作用,它给出了错误消息,消息 2812,级别 16,状态 62,第 74 行找不到存储过程“sp_GetDDL”。
【解决方案4】:

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

sp_help 'TableName'

【讨论】:

    【解决方案5】:

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

    【讨论】:

    • 这不是 T-SQL
    • 我想知道如果您使用 SQL Profiler 来捕获启动的命令,您会看到什么。 :->
    • 只是想补充一点,这不会编写任何 CDC 表 :( 因为 SMO 目前不支持它。
    • 我添加了一个带有 PowerShell 端口的答案。希望这对某人有所帮助。
    【解决方案6】:

    sp_help 'YourTableName'
    

    【讨论】:

      【解决方案7】:

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

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

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

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

      【讨论】:

        【解决方案8】:

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

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

        【讨论】:

          【解决方案9】:

          我知道这是一个老问题,但正是我想要的。因为我想对一些表进行批处理,所以我为 PowerShell 重写了 Anthony Faull 的 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"}
          

          【讨论】:

            【解决方案10】:

            只需键入表名并选择它并按 ATL + F1

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

            它将显示表格的完整定义。

            【讨论】:

            • 好一个))但对我来说,它显示了整个数据库的数据。我尝试了新的查询窗口,其中只有表名,但它不起作用 - 它总是显示所有内容。否则,很好的提示:)
            • 我在 2008 年和 2012 年使用它,不确定旧版本,它总是对我有用,只是表名和 ALT + F1,如果想使用架构,那么 'schema.table '。
            • 是sp_help 'schema.tablename'的快捷方式
            • 当我选择\突出显示表名时工作。如果查询窗口中还有其他内容,则显示整个数据库。
            【解决方案11】:

            @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 的 sn-p 中提到的命名空间引用。

            【讨论】:

              【解决方案12】:

              试试 sp_help 存储过程。

              sp_help

              【讨论】:

                【解决方案13】:

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

                EXEC sys.sp_columns @TABLE_NAME = 'YourTableName'
                

                【讨论】:

                  【解决方案14】:
                  SELECT ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
                         , IS_NULLABLE
                  FROM INFORMATION_SCHEMA.COLUMNS
                  WHERE TABLE_NAME = 'EMPLOYEES'
                  

                  【讨论】:

                    【解决方案15】:

                    作为对巴里回答的补充。 sp_help 也可以单独用于迭代特定数据库中的所有对象。您的武器库中还有 sp_helptext,它可以编写程序元素,例如存储过程。

                    【讨论】:

                      【解决方案16】:

                      一般表定义使用存储过程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。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2010-09-05
                        • 1970-01-01
                        • 2017-11-27
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多