Requête T-SQL pour afficher la définition de la table?


105

Qu'est-ce qu'une requête qui me montrera la définition complète, y compris les index et les clés d'une table SQL Server? Je veux une requête pure - et je sais que SQL Studio peut me donner cela, mais je suis souvent sur des ordinateurs «sauvages» qui n'ont que les applications les plus simples et je n'ai pas le droit d'installer Studio. Mais SQLCMD est toujours une option.

MISE À JOUR: J'ai essayé sp_help, mais cela ne donne qu'un seul enregistrement qui montre le nom, le propriétaire, le type et Created_Datetime. Y a-t-il autre chose qui me manque avec sp_help?

Voici ce que j'appelle:

aéroports sp_help

Notez que je veux vraiment le DDL qui définit la table.


1
Ce qui vous manque, sp_helpc'est qu'il renvoie plusieurs ensembles de résultats. Vous décrivez les colonnes renvoyées par le premier jeu de résultats.
Joe Stefanelli le

1
Bonne question. Venant de MySQL, les solutions sont trop courtes, car on ne peut pas voir les colonnes, les index, les clés étrangères, les noms de contraintes en un seul endroit. Ceci est grave lorsque vous avez de nombreuses bases de données / tables dans votre explorateur d'objets. J'espère que Microsoft résoudra ce problème à l'avenir. Je n'ai utilisé aucun outil de productivité mais SSMSBoost semble prometteur.
peter n

1
@Microsoft veuillez ajouter DESC TABLE comme MySQL. Facile. Facile. Terminé.
Pete Alvin

Réponses:


127

Il n'y a pas de moyen simple de renvoyer le DDL. Cependant, vous pouvez obtenir la plupart des détails des vues de schéma d'information et des vues système .

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
Je vous remercie. Je commençais à soupçonner que la seule façon d'obtenir cela serait d'interroger un certain nombre de tables séparées, et que c'est ce que fait SQL Studio lorsque vous lui dites de "générer DDL". Je suis surpris qu'il n'y ait pas de SP général qui le fera pour vous.
Daniel Williams

6
C'est. Si vous ne voulez que les informations de la colonne, vous pouvez exécuter sp_columnscomme je l'ai mentionné dans ma réponse. Si vous voulez des informations sur les FK, exécutez sp_fkeys. Si vous voulez connaître les index, exécutez sp_statistics.

69

Avez-vous essayé sp_help?

sp_help 'TableName'

1
Cela montre la structure, les contraintes, les types de contraintes, etc. Juste une chose à noter: vous devez écrire le nom complet du datatable. Schema.TableName. Sinon, cela résout complètement le problème et donne toutes les informations sur la table.
FrenkyB

1
Ne renvoie pas le DDL de la table, même avec le chemin complet écrit.
CoveGeek

25

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

Vous trouverez le code de sp_getddlprocédure pour SQL Server. Le but de la procédure est de créer un script pour toute table, table temporaire ou objet.

USAGE:

exec sp_GetDDL GMACT

ou

exec sp_GetDDL 'bob.example'

ou

exec sp_GetDDL '[schemaname].[tablename]'

ou

exec sp_GetDDL #temp

Je l'ai testé sur SQL Server 2012 et il fait un excellent travail.

Je ne suis pas l'auteur de la procédure. Toute amélioration que vous y apportez est envoyée à Lowell Izaguirre (scripts@stormrage.com).


Merci pour ce script et ce partage! Je demanderais, avez-vous un article où nous pouvons discuter de ce script?
Bellash

Excellent! MSFT doit avoir une telle fonction dans Management Studio
Tertium


18

Utilisez cette petite application de ligne de commande Windows qui obtient le CREATE TABLEscript (avec des contraintes) pour n'importe quelle table. Je l'ai écrit en C #. Compilez-le et transportez-le sur une clé USB. Peut-être que quelqu'un peut le porter sur 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
Ce n'est pas T-SQL cependant
ivan_pozdeev

Je me demande ce que vous verriez si vous utilisiez SQL Profiler pour capturer les commandes lancées. : ->
Paul Smith

Je voulais juste ajouter que cela ne scriptera aucune table CDC: (car elle n'est actuellement pas prise en charge dans SMO.
H. Abraham Chavez

J'ai ajouté une réponse avec un port PowerShell. J'espère que cela aide quelqu'un.
R. Horber


6

Cela renverra les colonnes, les types de données et les index définis sur la table:

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

--Table Definition
sp_help TableName

Cela renverra les déclencheurs définis sur la table:

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

6

Depuis SQL 2012, vous pouvez exécuter l'instruction suivante:

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

Si vous entrez une instruction de sélection complexe (jointures, sous-sélections, etc.), elle vous donnera la définition du jeu de résultats. C'est très pratique si vous devez créer une nouvelle table (ou table temporaire) et que vous ne voulez pas vérifier chaque définition de champ manuellement.

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


4

Tapez simplement le nom de la table et sélectionnez-le et appuyez sur ATL + F1

Dites que le nom de votre table Customerouvre une nouvelle fenêtre de requête , tapez et sélectionnez le nom de la table et appuyez sur ALT + F1

Il montrera la définition complète de la table.


Bon)) Mais pour moi, cela montre des données pour toute la base de données. J'ai essayé de nouvelles fenêtres de requête avec juste le nom de la table et cela ne fonctionne pas - il montre toujours tout. Sinon, bonne astuce :)
FrenkyB

Je l'ai utilisé avec 2008 et 2012, je ne suis pas sûr des anciennes versions, et cela fonctionne toujours pour moi, juste le nom de la table et ALT + F1, si vous voulez utiliser le schéma, alors «schema.table».
Ali Adravi

C'est le raccourci de sp_help 'schema.tablename'
Ali Adravi

2
A fonctionné lorsque j'ai sélectionné \ mis en évidence le nom de la table. Afficher la base de données entière s'il y avait autre chose dans la fenêtre de requête.
DB Tech

3

Une variante de la réponse de @Anthony Faull pour ceux qui utilisent LINQPad:

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

Vous devrez référencer 2 assemblys:

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

Et ajoutez des références d'espace de noms comme mentionné dans l'extrait d'Anthony.


3

Je sais que c'est une vieille question, mais exactement ce que je cherchais. Parce que je souhaite créer un script par lots sur certaines tables, j'ai réécrit le code C # d'Anthony Faull pour PowerShell.

Celui-ci utilise la sécurité intégrée:

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

Et ici avec nom d'utilisateur et mot de passe:

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

En complément de la réponse de Barry. Le sp_help peut également être utilisé seul pour itérer tous les objets dans une base de données particulière. Vous avez également sp_helptext pour votre arsenal, qui script des éléments programmatiques, comme les procédures stockées.


2

Une autre méthode consiste à exécuter la procédure sp_columns .

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

"Notez que je veux vraiment le DDL qui définit la table."

utilisez pg_dump:

pg_dump -s -t tablename dbname

Il vous donne la définition de table (il -ss'agit uniquement d'un schéma, pas de données) d'une certaine table ( -tnom de la table ) dans la base "dbname"de données en SQL brut. De plus, vous obtiendrez des informations sur la séquence, la clé primaire et la contrainte. La sortie que vous pouvez - peut-être après vérification et édition selon vos besoins - être réintroduite dans (la même ou une autre) base de données Postgres:

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

C'est pour UNIX / Linux, mais je suis sûr qu'un pg_dump existe également pour Windows.


1
Non! c'est pour postgres pas pour Microsoft SQL Server.
Mark le

3
Ignorer l'ensemble de la plate-forme et du moteur de base de données spécifiés dans la question. Agréable.
Jeremy
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.