Query T-SQL per mostrare la definizione della tabella?


105

Che cos'è una query che mi mostrerà la definizione completa, inclusi gli indici e le chiavi per una tabella di SQL Server? Voglio una query pura e so che SQL Studio può darmela, ma spesso sono su computer "selvaggi" che hanno solo le app più semplici e non ho i diritti per installare Studio. Ma SQLCMD è sempre un'opzione.

AGGIORNAMENTO: ho provato sp_help, ma produce solo un record che mostra Nome, Proprietario, Tipo e Created_Datetime. C'è qualcos'altro che mi manca con sp_help?

Ecco quello che chiamo:

sp_help aeroporti

Nota che voglio davvero il DDL che definisce la tabella.


1
Quello che ti manca sp_helpè che restituisce più set di risultati. Stai descrivendo le colonne restituite dal primo set di risultati.
Joe Stefanelli

1
Buona domanda. Provenendo da MySQL, le soluzioni sono troppo brevi, perché non si possono vedere colonne, indici, chiavi esterne, nomi di vincoli tutto in un unico posto. Ciò è grave quando si hanno molti database / tabelle nel proprio esploratore oggetti. Spero che Microsoft affronti questo problema in futuro. Non ho utilizzato strumenti di produttività ma SSMSBoost sembra promettente.
peter n

1
@Microsoft si prega di aggiungere DESC TABLE come MySQL. Facile. Semplice. Fatto.
Pete Alvin

Risposte:


127

Non esiste un modo semplice per restituire il DDL. Tuttavia è possibile ottenere la maggior parte dei dettagli dalle viste dello schema delle informazioni e dalle viste 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')

1
Grazie. Cominciavo a sospettare che l'unico modo per ottenerlo sarebbe stato interrogare in un certo numero di tabelle separate, e che è ciò che fa SQL Studio quando gli dici di "generare DDL". Sono sorpreso, ma non c'è nessun SP generale che lo farà per te.
Daniel Williams

6
È. Se vuoi solo le informazioni sulla colonna, puoi eseguire sp_columnscome ho menzionato nella mia risposta. Se vuoi informazioni sugli FK corri sp_fkeys. Se vuoi conoscere gli indici, esegui sp_statistics.

69

Hai provato sp_help?

sp_help 'TableName'

1
Questo mostra la struttura, i vincoli, i tipi di vincolo ecc. Solo una cosa da notare: è necessario scrivere il nome completo del datatable. Schema.nome. Altrimenti, risolve completamente il problema e fornisce tutte le informazioni sulla tabella.
FrenkyB

1
Non restituisce il DDL della tabella, anche con il percorso completo scritto.
CoveGeek

25

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

Troverai il codice di sp_getddlprocedura per SQL Server. Lo scopo della procedura è eseguire lo script di qualsiasi tabella, tabella temporanea o oggetto.

USO:

exec sp_GetDDL GMACT

o

exec sp_GetDDL 'bob.example'

o

exec sp_GetDDL '[schemaname].[tablename]'

o

exec sp_GetDDL #temp

L'ho testato su SQL Server 2012 e fa un ottimo lavoro.

Non sono l'autore della procedura. Qualsiasi miglioramento apportato ad esso invia a Lowell Izaguirre (scripts@stormrage.com).


Grazie per questo script e per la condivisione! Vorrei chiedere, hai un post in cui possiamo discutere di questo script?
Bellash

Eccellente! MSFT deve avere tale funzione all'interno di Management Studio
Tertium


18

Usa questa piccola app della riga di comando di Windows che ottiene lo CREATE TABLEscript (con vincoli) per qualsiasi tabella. L'ho scritto in C #. Basta compilarlo e portarlo su una memory stick. Forse qualcuno può portarlo su 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
Questo non è T-SQL però
ivan_pozdeev

Mi chiedo cosa vedresti se usassi SQL Profiler per catturare i comandi avviati. : ->
Paul Smith

Volevo solo aggiungere che questo non scriverà nessuna tabella CDC :( poiché attualmente non è supportato in SMO.
H. Abraham Chavez

Ho aggiunto una risposta con una porta PowerShell. Spero che questo aiuti qualcuno.
R. Horber


6

Questo restituirà colonne, tipi di dati e indici definiti nella tabella:

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

--Table Definition
sp_help TableName

Questo restituirà i trigger definiti nella tabella:

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

6

Da SQL 2012 è possibile eseguire la seguente istruzione:

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

Se inserisci un'istruzione select complessa (join, subselect, ecc.), Ti darà la definizione del set di risultati. Questo è molto utile se hai bisogno di creare una nuova tabella (o tabella temporanea) e non vuoi controllare manualmente ogni singola definizione di campo.

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


4

Digita semplicemente il nome della tabella, selezionalo e premi ATL + F1

Supponiamo che il nome della tabella sia Customerquindi aprire una nuova finestra di query , digitare e selezionare il nome della tabella e premere ALT + F1

Mostrerà la definizione completa di tabella.


Buono)) Ma per me, mostra i dati per l'intero database. Ho provato nuove finestre di query con solo il nome della tabella e non funziona: mostra sempre tutto. Altrimenti, bel suggerimento :)
FrenkyB

L'ho usato con il 2008 e il 2012, non sono sicuro delle versioni precedenti, e funziona sempre per me, solo il nome della tabella e ALT + F1, se si desidera utilizzare lo schema, quindi "schema.table".
Ali Adravi

È la scorciatoia di sp_help 'schema.tablename'
Ali Adravi

2
Ha funzionato quando ho selezionato \ evidenziato il nome della tabella. Ha mostrato l'intero database se c'era qualcos'altro nella finestra della query.
DB Tech

3

Una variazione della risposta di @Anthony Faull per coloro che utilizzano LINQPad:

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

Dovrai fare riferimento a 2 assembly:

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

E aggiungi i riferimenti allo spazio dei nomi come menzionato nello snippet di Anthony.


3

So che è una vecchia domanda, ma esattamente quello che stavo cercando. Poiché voglio eseguire lo scripting in batch di alcune tabelle, ho riscritto il codice C # di Anthony Faull per PowerShell.

Questo utilizza la sicurezza integrata:

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

E qui con nome utente e password:

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

Come aggiunta alla risposta di Barry. Lo sp_help può essere utilizzato anche da solo per iterare tutti gli oggetti in un database particolare. Hai anche sp_helptext per il tuo arsenale, che esegue lo script di elementi programmatici, come le procedure memorizzate.



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

-5

"Nota che voglio davvero il DDL che definisce la tabella."

usa pg_dump:

pg_dump -s -t tablename dbname

Fornisce la definizione della tabella ( -sè solo schema, nessun dato) di una determinata tabella ( -ttablename) nel database "dbname"in semplice SQL. Inoltre otterrai informazioni su sequenza, chiave primaria e vincoli. L'output che puoi -forse dopo aver controllato e modificato in base alle tue esigenze- essere reinserito nel (lo stesso o un altro) database Postgres:

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

Questo è per UNIX / Linux, ma sono sicuro che esista anche pg_dump per Windows.


1
No! questo è per postgres non per Microsoft SQL Server.
Marco

3
Ignorando l'intera piattaforma e il motore di database specificati nella domanda. Bello.
Jeremy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.