T-SQL-Abfrage zur Anzeige der Tabellendefinition?


104

Was ist eine Abfrage, die mir die vollständige Definition zeigt, einschließlich Indizes und Schlüssel für eine SQL Server-Tabelle? Ich möchte eine reine Abfrage - und weiß, dass SQL Studio mir diese geben kann, aber ich bin oft auf "wilden" Computern, die nur die einfachsten Apps haben, und ich habe keine Rechte, Studio zu installieren. Aber SQLCMD ist immer eine Option.

UPDATE: Ich habe sp_help ausprobiert, aber es wird nur ein Datensatz ausgegeben, der Name, Eigentümer, Typ und Erstellungszeit anzeigt. Fehlt mir noch etwas mit sp_help?

Folgendes nenne ich:

sp_help Flughäfen

Beachten Sie, dass ich wirklich die DDL möchte, die die Tabelle definiert.


1
Was Sie vermissen, sp_helpist, dass es mehrere Ergebnismengen zurückgibt. Sie beschreiben die Spalten, die von der ersten Ergebnismenge zurückgegeben werden.
Joe Stefanelli

1
Gute Frage. Aus MySQL kommend, sind die Lösungen zu kurz, da man Spalten, Indizes, Fremdschlüssel und Einschränkungsnamen nicht an einer Stelle sehen kann. Dies ist schwerwiegend, wenn Ihr Objekt-Explorer viele Datenbanken / Tabellen enthält. Ich hoffe, Microsoft geht dies in Zukunft an. Ich habe keine Produktivitätswerkzeuge verwendet, aber SSMSBoost sieht vielversprechend aus.
Peter n

1
@Microsoft bitte DESC TABLE wie MySQL hinzufügen. Einfach. Einfach. Getan.
Pete Alvin

Antworten:


127

Es gibt keine einfache Möglichkeit, die DDL zurückzugeben. Die meisten Details finden Sie jedoch in den Informationsschemaansichten und Systemansichten .

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
Danke dir. Ich begann zu vermuten, dass der einzige Weg, dies zu erreichen, darin besteht, mehrere separate Tabellen abzufragen, und dass SQL Studio dies tut, wenn Sie es anweisen, "DDL zu generieren". Ich bin aber überrascht, dass es keinen allgemeinen SP gibt, der das für Sie erledigt.
Daniel Williams

6
Es ist. Wenn Sie nur die Spalteninformationen möchten, können Sie diese sp_columnswie in meiner Antwort erwähnt ausführen . Wenn Sie Informationen über FKs möchten, laufen Sie sp_fkeys. Wenn Sie Indizes kennen möchten, führen Sie aus sp_statistics.

69

Haben Sie sp_help ausprobiert?

sp_help 'TableName'

1
Dies zeigt Struktur, Einschränkungen, Kontraint-Typen usw. Nur eines ist zu beachten: Sie müssen den vollständigen Namen der Datentabelle schreiben. Schema.TableName. Andernfalls wird das Problem vollständig gelöst und es werden alle Informationen zur Tabelle angezeigt.
FrenkyB

1
Gibt die DDL der Tabelle nicht zurück, auch wenn der vollständige Pfad geschrieben wurde.
CoveGeek

25

Besuchen Sie http://www.stormrage.com/SQLStuff/sp_GetDDL_Latest.txt .

Sie finden den sp_getddlVerfahrenscode für SQL Server. Der Zweck der Prozedur ist das Skript einer beliebigen Tabelle, temporären Tabelle oder eines beliebigen Objekts.

VERWENDUNG:

exec sp_GetDDL GMACT

oder

exec sp_GetDDL 'bob.example'

oder

exec sp_GetDDL '[schemaname].[tablename]'

oder

exec sp_GetDDL #temp

Ich habe es auf SQL Server 2012 getestet und es leistet hervorragende Arbeit.

Ich bin nicht der Autor des Verfahrens. Alle Verbesserungen, die Sie daran vornehmen, senden Sie an Lowell Izaguirre (scripts@stormrage.com).


Vielen Dank für dieses Skript und das Teilen! Ich würde fragen, haben Sie einen Beitrag, in dem wir über dieses Skript diskutieren können?
Bellash

Ausgezeichnet! MSFT muss eine solche Funktion in Management Studio
Tertium


18

Verwenden Sie diese kleine Windows-Befehlszeilen-App, die das CREATE TABLESkript (mit Einschränkungen) für jede Tabelle abruft. Ich habe es in C # geschrieben. Kompilieren Sie es einfach und tragen Sie es auf einem Memory Stick. Vielleicht kann es jemand nach Powershell portieren.

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
Dies ist jedoch nicht T-SQL
ivan_pozdeev

Ich frage mich, was Sie sehen würden, wenn Sie SQL Profiler verwenden würden, um die Befehle zu erfassen, die dies ausgelöst hat. : ->
Paul Smith

Ich wollte nur hinzufügen, dass dies keine CDC-Tabellen auslotet :( da es derzeit in SMO nicht unterstützt wird.
H. Abraham Chavez

Ich habe eine Antwort mit einem PowerShell-Port hinzugefügt. Hoffe das hilft jemandem.
R. Horber


6

Dadurch werden in der Tabelle definierte Spalten, Datentypen und Indizes zurückgegeben:

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

--Table Definition
sp_help TableName

Dies gibt die in der Tabelle definierten Trigger zurück:

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

5

Seit SQL 2012 können Sie die folgende Anweisung ausführen:

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

Wenn Sie eine komplexe select-Anweisung (Verknüpfungen, Unterauswahlen usw.) eingeben, erhalten Sie die Definition der Ergebnismenge. Dies ist sehr praktisch, wenn Sie eine neue Tabelle (oder temporäre Tabelle) erstellen müssen und nicht jede einzelne Felddefinition manuell überprüfen möchten.

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


4

Geben Sie einfach den Tabellennamen ein und wählen Sie ihn aus und drücken Sie ATL + F1

Angenommen, Ihr Tabellenname Customeröffnet ein neues Abfragefenster , geben Sie den Tabellennamen ein , wählen Sie ihn aus und drücken Sie ALT + F1

Es wird die vollständige Definition der Tabelle angezeigt.


Gut)) Aber für mich zeigt es Daten für die gesamte Datenbank. Ich habe neue Abfragefenster mit nur einem Tabellennamen ausprobiert und es funktioniert nicht - es zeigt immer alles an. Ansonsten schöner Tipp :)
FrenkyB

Ich habe es mit 2008 und 2012 verwendet, bin mir bei den älteren Versionen nicht sicher, und es funktioniert immer für mich. Nur der Tabellenname und ALT + F1. Wenn Sie das Schema verwenden möchten, dann 'schema.table'.
Ali Adravi

Es ist die Abkürzung von sp_help 'schema.tabellenname'
Ali Adravi

2
Funktioniert, als ich \ den Tabellennamen ausgewählt \ hervorgehoben habe. Zeigt die gesamte Datenbank an, wenn sich noch etwas im Abfragefenster befindet.
DB Tech

3

Eine Variation der Antwort von @Anthony Faull für Benutzer von LINQPad:

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

Sie müssen auf 2 Baugruppen verweisen:

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

Und fügen Sie Namespace-Referenzen hinzu, wie in Anthonys Snippet erwähnt.


3

Ich weiß, dass es eine alte Frage ist, aber genau das, wonach ich gesucht habe. Da ich einige Tabellen stapelweise skripten möchte, habe ich den C # -Code von Anthony Faull für PowerShell neu geschrieben.

Dieser verwendet integrierte Sicherheit:

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

Und hier mit Benutzername und Passwort:

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

Als Ergänzung zu Barrys Antwort. Der sp_help kann auch alleine verwendet werden, um alle Objekte in einer bestimmten Datenbank zu iterieren. Sie haben auch sp_helptext für Ihr Arsenal, das programmatische Elemente wie gespeicherte Prozeduren auszeichnet.


2

Eine andere Möglichkeit besteht darin, die Prozedur sp_columns auszuführen .

EXEC sys.sp_columns @TABLE_NAME = 'YourTableName'

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

-5

"Beachten Sie, dass ich wirklich die DDL möchte, die die Tabelle definiert."

benutze pg_dump:

pg_dump -s -t tablename dbname

Sie erhalten die Tabellendefinition ( -snur Schema, keine Daten) einer bestimmten Tabelle ( -tTabellenname) in der Datenbank "dbname"in einfachem SQL. Zusätzlich erhalten Sie Sequenz-, Primärschlüssel- und Einschränkungsinformationen. Die Ausgabe, die Sie - möglicherweise nach Überprüfung und Bearbeitung gemäß Ihren Anforderungen - erneut in die (gleiche oder eine andere) Postgres-Datenbank einspeisen können:

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

Dies ist für UNIX / Linux, aber ich bin sicher, dass ein pg_dump auch für Windows existiert.


1
Nein! Dies gilt für Postgres, nicht für Microsoft SQL Server.
Mark

3
Ignorieren der gesamten in der Frage angegebenen Plattform und Datenbank-Engine. Nett.
Jeremy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.