T-SQL-запит для відображення визначення таблиці?


105

Що таке запит, який покаже мені повне визначення, включаючи індекси та ключі для таблиці SQL Server? Я хочу отримати чистий запит - і знаю, що SQL Studio може мені це дати, але я часто перебуваю на «диких» комп’ютерах, у яких є лише найпростіші програми, і я не маю права встановлювати студію. Але SQLCMD - це завжди варіант.

ОНОВЛЕННЯ: Я спробував sp_help, але це лише один результат, який показує ім'я, власник, тип та створений_дату. Чи є щось інше, чого мені не вистачає у sp_help?

Ось що я називаю:

sp_help аеропорти

Зауважте, що я дуже хочу DDL, який визначає таблицю.


1
Чого вам не вистачає, sp_helpце те, що він повертає кілька наборів результатів. Ви описуєте стовпці, повернуті першим набором результатів.
Джо Стефанеллі

1
Гарне питання. Починаючи з MySQL, рішення стають занадто короткими, тому не можна побачити стовпчики, індекси, зовнішні ключі, імена обмежень в одному місці. Це важко, коли у вашому об'єкті провідників є багато баз даних / таблиць. Сподіваюся, що Microsoft вирішить це в майбутньому. Я не використовував жодних інструментів продуктивності, але SSMSBoost виглядає перспективно.
peter n

1
@Microsoft будь ласка, додайте DESC TABLE, як MySQL. Легко. Простий. Зроблено.
Піт Елвін

Відповіді:


127

Немає простого способу повернути DDL. Однак ви можете отримати більшість деталей з представлень інформаційних схем та системних представлень .

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
Дякую. Я починав підозрювати, що єдиним способом отримати це було б запит у ряд окремих таблиць, і що саме SQL Studio робить, коли ви кажете йому "генерувати DDL". Я, але здивований, що немає загального СП, який зробить це за вас.
Даніель Вільямс

6
Це є. Якщо ви хочете лише інформацію про стовпчик, ви можете виконати так, sp_columnsяк я згадував у своїй відповіді. Якщо ви хочете отримати інформацію про FKS, запустіть sp_fkeys. Якщо ви хочете знати індекси, виконайте sp_statistics.

69

Ви спробували sp_help?

sp_help 'TableName'

1
Це показує структуру, обмеження, типи протипоказань тощо. Зауважимо лише одне: ви повинні написати повне ім'я даних. Schema.TableName. В іншому випадку він повністю вирішує проблему і дає всю інформацію про таблицю.
FrenkyB

1
Не повертає DDL таблиці навіть із записаним повним контуром.
CoveGeek

25

Відвідайте http://www.stormrage.com/SQLStuff/sp_GetDDL_Latest.txt .

Ви знайдете код sp_getddlпроцедури для SQL Server. Метою процедури є скрипт будь-якої таблиці, темп-таблиці або об'єкта.

ВИКОРИСТАННЯ:

exec sp_GetDDL GMACT

або

exec sp_GetDDL 'bob.example'

або

exec sp_GetDDL '[schemaname].[tablename]'

або

exec sp_GetDDL #temp

Я тестував його на SQL Server 2012, і це прекрасно справляється.

Я не автор процедури. Будь-яке вдосконалення, яке ви внесите до нього, надсилайте на адресу Лоуелла Ізаґурре (scriptpts@stormrage.com).


Дякую за цей сценарій та обмін! Я б запитав, чи є у вас пост, де ми можемо обговорити цей сценарій?
Беллаш

Відмінно! MSFT повинна мати таку функцію в студії Management
Tertium

19

Найпростіший і швидкий спосіб, який я можу придумати, - це використовувати sp_help

sp_help 'TableName'


18

Використовуйте цей невеликий додаток командного рядка Windows, який отримує CREATE TABLEсценарій (з обмеженнями) для будь-якої таблиці. Я написав це на C #. Просто складіть його і перенесіть на флешку пам'яті. Можливо, хтось може переправити його до 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
Це не T-SQL, хоча
ivan_pozdeev

Цікаво, що ви побачили, якби ви використовували SQL Profiler для зйомки команд, які розпочалися. : ->
Пол Сміт

Просто хотів додати, що цей сценарій не викриває жодних таблиць CDC :( оскільки він наразі не підтримується в SMO.
Х. Абрахам Чавес

Я додав відповідь через порт PowerShell. Сподіваюся, це комусь допомагає.
Р. Горбер


6

Це поверне стовпці, типи даних та індекси, визначені в таблиці:

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

--Table Definition
sp_help TableName

Це поверне тригери, визначені в таблиці:

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

6

З SQL 2012 ви можете запустити наступне твердження:

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

Якщо ви введете складний оператор select (приєднується, підселектори тощо), він дасть вам визначення набору результатів. Це дуже зручно, якщо вам потрібно створити нову таблицю (або темп-таблицю), і ви не хочете перевіряти кожне визначення поля вручну.

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


4

Просто введіть назву таблиці та виберіть її та натисніть ATL + F1

Скажіть, що ваше ім'я таблиці Customerвідкриється новим вікном запиту , введіть і виберіть ім'я таблиці та натисніть ALT + F1

Він покаже повне визначення таблиці.


Хороший)) Але для мене він показує дані для всієї бази даних. Я спробував нові вікна запитів із простою назвою таблиці, і він не працює - він завжди показує все. Інакше приємна порада :)
FrenkyB

Я використовував це з 2008 та 2012 роками, не впевнений у старіших версіях, і він завжди працює для мене, просто ім'я таблиці та ALT + F1, якщо потрібно використовувати схему, то "schema.table".
Алі Адраві

Це ярлик sp_help 'schema.tablename'
Алі Адраві

2
Працювало, коли я вибрав \ виділив назву таблиці. Показано всю базу даних, якщо в вікні запитів було ще щось.
DB Tech

3

Варіант відповіді @Anthony Faull для тих, хто використовує LINQPad:

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

Вам потрібно буде посилатися на 2 збірки:

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

І додайте посилання на простір імен, як згадується у фрагменті Ентоні.


3

Я знаю, що це старе питання, але саме те, що я шукав. Оскільки я хочу створити пакет сценаріїв деяких таблиць, я переписав код C # від Anthony Faull для PowerShell.

У цьому використовується інтегрована безпека:

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

І ось з ім’ям користувача та паролем:

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

Як доповнення до відповіді Баррі. Sp_help також може використовуватися сам для ітерації всіх об'єктів у певній базі даних. Ви також маєте sp_helptext для свого арсеналу, який виписує програмні елементи, як-от збережені процедури.


2

Інший спосіб - виконання процедури sp_column .

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

"Зауважте, що я дуже хочу DDL, який визначає таблицю."

використовувати pg_dump:

pg_dump -s -t tablename dbname

Це дає вам визначення таблиці ( -sтільки схема, відсутні дані) певної таблиці ( -tім'я таблиці ) в базі даних "dbname"в простому SQL. Крім того, ви отримаєте інформацію про послідовність, первинний ключ та обмеження. Вихід, який ви можете зробити після перевірки та редагування відповідно до ваших потреб, знову надсилатиметься у (ту чи іншу) базу даних Postgres:

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

Це для UNIX / Linux, але я впевнений, що pg_dump також існує для Windows.


1
Немає! це для постгресів, не для Microsoft SQL Server.
Марк

3
Ігнорування всієї платформи та двигуна баз даних, зазначених у питанні. Приємно.
Джеремі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.