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.