web-dev-qa-db-fra.com

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

Qu'est-ce qu'une requête qui affiche 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 le donner, mais je suis souvent sur des ordinateurs "sauvages" qui ne disposent que des applications les plus simples et je n’ai aucun droit d’installer Studio. Mais SQLCMD est toujours une option.

UPDATE: J'ai essayé sp_help, mais cela ne donne qu'un enregistrement qui indique Nom, Propriétaire, Type et Created_Datetime. Y a-t-il autre chose qui me manque avec sp_help?

Voici ce que j'appelle:

sp_help aéroports

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

92
Daniel Williams

Il n'y a pas de moyen facile de retourner le DDL. Cependant, vous pouvez obtenir la plupart des détails à partir de Vues du schéma d'information et 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')
100
Anthony Faull

Avez-vous essayé sp_help?

sp_help 'TableName'
60
SQLMenace

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

Vous trouverez le code de la procédure sp_getddl pour SQL Server . Le but de la procédure est de scripter une table, une table temporaire ou un 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 apportez à ce dernier est envoyée à Lowell Izaguirre ([email protected]).

19
Dexter Vaca

Utilisez cette petite application en ligne de commande Windows qui obtient le script CREATE TABLE (avec contraintes) pour n’importe quelle table. Je l'ai écrit en C #. Il suffit de le compiler et de le transporter sur une clé USB. Peut-être que quelqu'un peut le porter à 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);
        }
    }
}
18
Anthony Faull

Le moyen le plus simple et le plus rapide auquel je puisse penser serait d’utiliser sp_help

sp_help 'TableName'

15
codingbadger

sp_help 'YourTableName'
8
Joe Stefanelli

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 retournera les triggers définis sur la table:

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

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 aux espaces de noms, comme indiqué dans l'extrait de code d'Anthony.

3
Taras Strypko

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 select complexe (jointures, sous-requêtes, 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 une table temporaire) et que vous ne voulez pas vérifier manuellement chaque définition de champ.

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

2
Dan Stef

Essayez la procédure stockée sp_help.

sp_help <>

2
dotnetster

En complément de la réponse de Barry. Sp_help peut également être utilisé seul pour itérer tous les objets d'une base de données particulière. Vous avez également sp_helptext pour votre arsenal, qui écrit les éléments de programmation, comme les procédures stockées.

2
Gregory A Beamer

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

Supposons que le nom de votre table est Customer, ouvrez 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 du tableau.

2
Ali Adravi

Une autre méthode consiste à exécuter sp_columns procedure.

EXEC sys.sp_columns @TABLE_NAME = 'YourTableName'
2
user532231
SELECT ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
       , IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'EMPLOYEES'
0
Mahmoud Saleh

Je sais que c'est une vieille question, mais exactement ce que je cherchais. Parce que je veux effectuer un script batch 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"}
0
R. Horber