¿Consulta T-SQL para mostrar la definición de la tabla?

105

¿Qué es una consulta que me mostrará la definición completa, incluidos índices y claves para una tabla de SQL Server? Quiero una consulta pura, y sé que SQL Studio puede darme esto, pero a menudo estoy en computadoras "salvajes" que tienen solo las aplicaciones más básicas y no tengo derechos para instalar Studio. Pero SQLCMD siempre es una opción.

ACTUALIZACIÓN: He intentado sp_help, pero solo produce un registro que muestra el nombre, el propietario, el tipo y la fecha de creación. ¿Hay algo más que me falta con sp_help?

Esto es lo que llamo:

aeropuertos sp_help

Tenga en cuenta que realmente quiero el DDL que define la tabla.

Daniel Williams
fuente
1
Lo que te falta sp_helpes que devuelve múltiples conjuntos de resultados. Estás describiendo las columnas devueltas por el primer conjunto de resultados.
Joe Stefanelli
1
Buena pregunta. Viniendo de MySQL, las soluciones son demasiado cortas, ya que no se pueden ver columnas, índices, claves externas, nombres de restricciones, todo en un solo lugar. Esto es grave cuando tiene muchas bases de datos / tablas en su explorador de objetos. Espero que Microsoft aborde esto en el futuro. No he utilizado ninguna herramienta de productividad, pero SSMSBoost parece prometedor.
peter n
1
@Microsoft, agregue DESC TABLE como MySQL. Fácil. Sencillo. Hecho.
Pete Alvin

Respuestas:

127

No hay una forma fácil de devolver el DDL. Sin embargo, puede obtener la mayoría de los detalles de las vistas del esquema de información y las vistas del sistema .

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')
Anthony Faull
fuente
1
Gracias. Empezaba a sospechar que la única forma de obtener esto sería consultar en varias tablas separadas, y que eso es lo que hace SQL Studio cuando le dice que "genere DDL". Estoy sorprendido de que no haya ningún SP general que lo haga por usted.
Daniel Williams
6
Es. Si solo desea la información de la columna, puede ejecutar sp_columnscomo mencioné en mi respuesta. Si quieres información sobre FK, corre sp_fkeys. Si desea conocer los índices, ejecute sp_statistics.
69

¿Has probado sp_help?

sp_help 'TableName'
SQLMenace
fuente
1
Esto muestra estructura, restricciones, tipos de restricciones, etc. Solo una cosa a tener en cuenta: debe escribir el nombre completo de la tabla de datos. Schema.TableName. De lo contrario, resuelve completamente el problema y brinda toda la información sobre la tabla.
FrenkyB
1
No devuelve el DDL de la tabla, incluso con la ruta completa escrita.
CoveGeek
25

Visite http://www.stormrage.com/SQLStuff/sp_GetDDL_Latest.txt .

Encontrará el código de sp_getddlprocedimiento para SQL Server. El propósito del procedimiento es crear un script en cualquier tabla, tabla temporal u objeto.

USO:

exec sp_GetDDL GMACT

o

exec sp_GetDDL 'bob.example'

o

exec sp_GetDDL '[schemaname].[tablename]'

o

exec sp_GetDDL #temp

Lo probé en SQL Server 2012 y hace un trabajo excelente.

No soy el autor del procedimiento. Cualquier mejora que le haga, envíela a Lowell Izaguirre ([email protected]).

Dexter Vaca
fuente
¡Gracias por este guión y por compartir! Le preguntaría, ¿tiene una publicación en la que podamos discutir sobre este guión?
Bellash
¡Excelente! MSFT debe tener dicha función dentro de Management Studio
Tertium
19

La forma más fácil y rápida en la que puedo pensar sería usar sp_help

sp_help 'TableName'

codificador
fuente
18

Utilice esta pequeña aplicación de línea de comandos de Windows que obtiene el CREATE TABLEscript (con restricciones) para cualquier tabla. Lo he escrito en C #. Simplemente compílelo y llévelo en una tarjeta de memoria. Quizás alguien pueda portarlo a 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);
        }
    }
}
Anthony Faull
fuente
2
Sin embargo
ivan_pozdeev
Me pregunto qué vería si usara SQL Profiler para capturar los comandos que esto inició. : ->
Paul Smith
Solo quería agregar que esto no eliminará ninguna tabla de CDC :( ya que actualmente no es compatible con SMO.
H. Abraham Chavez
Agregué una respuesta con un puerto PowerShell. Espero que esto ayude a alguien.
R. Horber
11

sp_help 'YourTableName'
Joe Stefanelli
fuente
6

Esto devolverá columnas, tipos de datos e índices definidos en la tabla:

--List all tables in DB
select * from sysobjects where xtype = 'U'

--Table Definition
sp_help TableName

Esto devolverá los disparadores definidos en la tabla:

--Triggers in SQL Table
select * from sys.triggers where parent_id = object_id(N'SQLTableName') 
Siva
fuente
6

Desde SQL 2012 puede ejecutar la siguiente declaración:

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

Si ingresa una declaración de selección compleja (uniones, subselecciones, etc.), le dará la definición del conjunto de resultados. Esto es muy útil si necesita crear una nueva tabla (o tabla temporal) y no desea verificar cada definición de campo de forma manual.

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

Dan Stef
fuente
4

Simplemente escriba el nombre de la tabla, selecciónelo y presione ATL + F1

Digamos que el nombre de su tabla es, Customerluego abra una nueva ventana de consulta , escriba y seleccione el nombre de la tabla y presione ALT + F1

Mostrará la definición completa de tabla.

Ali Adravi
fuente
Buena)) Pero para mí, muestra datos para toda la base de datos. Probé nuevas ventanas de consulta con solo el nombre de la tabla y no funciona, siempre muestra todo. De lo contrario, buen consejo :)
FrenkyB
Lo usé con 2008 y 2012, no estoy seguro de las versiones anteriores, y siempre funciona para mí, solo el nombre de la tabla y ALT + F1, si desea usar el esquema, entonces 'schema.table'.
Ali Adravi
Es el atajo de sp_help 'schema.tablename'
Ali Adravi
2
Funcionó cuando seleccioné \ resalté el nombre de la tabla. Mostró la base de datos completa si había algo más en la ventana de consulta.
DB Tech
3

Una variación de la respuesta de @Anthony Faull para aquellos que usan LINQPad:

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

Deberá hacer referencia a 2 ensamblados:

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

Y agregue referencias de espacio de nombres como se menciona en el fragmento de Anthony.

Taras Strypko
fuente
3

Sé que es una vieja pregunta, pero exactamente lo que estaba buscando. Como quiero crear un script por lotes para algunas tablas, reescribí el código C # de Anthony Faull para PowerShell.

Este usa seguridad integrada:

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

Y aquí con nombre de usuario y contraseña:

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"}
R. Horber
fuente
2

Pruebe el procedimiento almacenado sp_help.

sp_help <>

dotnetster
fuente
2

Como complemento a la respuesta de Barry. El sp_help también se puede utilizar por sí mismo para iterar todos los objetos en una base de datos en particular. También tiene sp_helptext para su arsenal, que codifica elementos programáticos, como procedimientos almacenados.

Gregory A Beamer
fuente
2

Otra forma es ejecutar el procedimiento sp_columns .

EXEC sys.sp_columns @TABLE_NAME = 'YourTableName'

fuente
0
SELECT ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
       , IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'EMPLOYEES'
Mahmoud Saleh
fuente
-5

"Tenga en cuenta que realmente quiero el DDL que define la tabla".

use pg_dump:

pg_dump -s -t tablename dbname

Le brinda la definición de la tabla ( -ses solo esquema, sin datos) de una tabla determinada (nombre de la -ttabla) en la base "dbname"de datos en SQL simple. Además, obtendrá información de secuencia, clave principal y restricción. La salida que puede, tal vez después de verificar y editar según sus necesidades, volver a ingresar a la base de datos de Postgres (la misma u otra):

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

Esto es para UNIX / Linux, pero estoy seguro de que también existe un pg_dump para Windows.

Norbert Poellmann
fuente
1
¡No! esto es para postgres, no para Microsoft SQL Server.
Marcos
3
Ignorando toda la plataforma y el motor de base de datos especificado en la pregunta. Agradable.
Jeremy