119 votes

T-SQL query to show table definition?

Quelle est une requête qui va me montrer la définition complète, y compris les index et les clés pour 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 basiques et je n'ai pas les droits pour installer studio. Mais SQLCMD est toujours une option.

MISE À JOUR : J'ai essayé sp_help, mais il ne donne qu'un enregistrement qui montre Nom, Propriétaire, Type et Created_Datetime. Est-ce qu'il y a quelque chose d'autre que je manque avec sp_help?

Voici ce que j'appelle :

sp_help airports

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

1 votes

Bonne question. Venant de MySQL, les solutions sont trop limitées, car on ne peut pas voir les colonnes, les index, les clés étrangères, les noms de contraintes tous au même endroit. Cela est grave lorsque vous avez de nombreuses bases de données/tables dans votre explorateur d'objets. J'espère que Microsoft abordera cela à l'avenir. Je n'ai pas utilisé d'outils de productivité, mais SSMSBoost semble prometteur.

1 votes

@Microsoft s'il vous plaît ajoutez DESC TABLE comme MySQL. Facile. Simple. Fait.

1 votes

Ce que vous manquez avec sp_help est qu'il renvoie plusieurs ensembles de résultats. Vous décrivez les colonnes renvoyées par le premier ensemble de résultats.

139voto

Anthony Faull Points 6490

Il n'existe pas de moyen facile de retourner le DDL. Cependant, vous pouvez obtenir la plupart des détails à partir des vues du 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')

2 votes

Merci. 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 c'est ce que fait SQL Studio lorsque vous lui demandez de "générer une DDL". Je suis un peu surpris qu'il n'existe pas de SP général qui le fera pour vous.

6 votes

C'est le cas. Si vous voulez uniquement les informations sur la colonne, vous pouvez exécuter sp_columns comme je l'ai mentionné dans ma réponse. Si vous voulez des informations sur les clés étrangères, exécutez sp_fkeys. Si vous voulez savoir les index, exécutez sp_statistics.

76voto

SQLMenace Points 68670

Avez-vous essayé sp_help ?

sp_help 'NomTable'

1 votes

Cela montre la structure, les contraintes, les types de contraintes, etc. Juste une chose à noter : vous devez écrire le nom complet de la table de données. Schéma.NomTable. Sinon, cela résout complètement le problème et donne toutes les informations sur la table.

3 votes

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

19voto

Barry Points 18913

La manière la plus facile et la plus rapide à laquelle je peux penser serait d'utiliser sp_help

sp_help 'TableName'

18voto

Anthony Faull Points 6490

Utilisez cette petite application en ligne de commande Windows qui obtient le script CREATE TABLE (avec les contraintes) pour n'importe quelle table. Je l'ai écrit en C#. Compilez-le et emportez-le sur une clé USB. Peut-être que quelqu'un pourra le porter vers 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("Syntaxe : ViewSource.exe " +
                     "     ");
            }

            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()
                .Select(s => s + "\n" + "GO")
                .ToList()
                .ForEach(Console.WriteLine);
        }
    }
}

3 votes

Ce n'est pas du T-SQL cependant

0 votes

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

0 votes

Je voulais juste ajouter que cela ne scriptera pas les tables CDC :( car cela n'est actuellement pas pris en charge dans SMO.

11voto

Joe Stefanelli Points 72874
sp_help 'VotreNomDeTable'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X