Kueri T-SQL untuk menampilkan definisi tabel?

105

Apa kueri yang akan menunjukkan kepada saya definisi lengkap, termasuk indeks dan kunci untuk tabel SQL Server? Saya ingin kueri murni - dan tahu bahwa SQL Studio dapat memberikan ini kepada saya, tetapi saya sering berada di komputer "liar" yang hanya memiliki aplikasi paling sederhana dan saya tidak memiliki hak untuk menginstal studio. Tapi SQLCMD selalu menjadi pilihan.

UPDATE: Saya telah mencoba sp_help, tetapi hanya menghasilkan satu record yang menunjukkan Name, Owner, Type dan Created_Datetime. Apakah ada hal lain yang saya lewatkan dengan sp_help?

Inilah yang saya sebut:

sp_help bandara

Perhatikan bahwa saya benar-benar menginginkan DDL yang mendefinisikan tabel.

Daniel Williams
sumber
1
Apa yang Anda lewatkan sp_helpadalah mengembalikan beberapa set hasil. Anda menjelaskan kolom yang dikembalikan oleh kumpulan hasil pertama.
Joe Stefanelli
1
Pertanyaan bagus. Berasal dari MySQL, solusinya terlalu pendek, karena orang tidak dapat melihat kolom, indeks, kunci asing, nama kendala semua di satu tempat. Ini parah ketika Anda memiliki banyak database / tabel di penjelajah objek Anda. Semoga Microsoft membahas ini di masa depan. Saya belum pernah menggunakan alat produktivitas apa pun tetapi SSMSBoost terlihat menjanjikan.
peter n
1
@Microsoft tolong tambahkan DESC TABLE seperti MySQL. Mudah. Sederhana. Selesai.
Pete Alvin

Jawaban:

127

Tidak ada cara mudah untuk mengembalikan DDL. Namun Anda bisa mendapatkan sebagian besar detail dari Tampilan Skema Informasi dan Tampilan Sistem .

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')
Anthony Faull
sumber
1
Terima kasih. Saya mulai curiga bahwa satu-satunya cara untuk mendapatkan ini adalah dengan query ke sejumlah tabel terpisah, dan itulah yang dilakukan SQL Studio ketika Anda menyuruhnya untuk "menghasilkan DDL". Saya tapi terkejut tidak ada SP umum yang akan melakukannya untuk Anda.
Daniel Williams
6
Ini. Jika Anda hanya menginginkan info kolom, Anda dapat mengeksekusi sp_columnsseperti yang saya sebutkan dalam jawaban saya. Jika ingin info tentang FK jalankan sp_fkeys. Jika Anda ingin mengetahui indeks, jalankan sp_statistics.
69

Sudahkah Anda mencoba sp_help?

sp_help 'TableName'
SQLMenace
sumber
1
Ini menunjukkan struktur, batasan, jenis kontras, dll. Satu hal yang perlu diperhatikan: Anda harus menulis nama lengkap dari datatable. Schema.TableName. Jika tidak, itu benar-benar menyelesaikan masalah dan memberikan semua info tentang tabel.
FrenkyB
1
Tidak mengembalikan DDL tabel, bahkan dengan jalur lengkap tertulis.
CoveGeek
25

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

Anda akan menemukan kode sp_getddlprosedur untuk SQL Server. Tujuan dari prosedur ini adalah membuat skrip tabel, tabel temp atau objek apa pun.

PEMAKAIAN:

exec sp_GetDDL GMACT

atau

exec sp_GetDDL 'bob.example'

atau

exec sp_GetDDL '[schemaname].[tablename]'

atau

exec sp_GetDDL #temp

Saya mengujinya di SQL Server 2012, dan berfungsi dengan sangat baik.

Saya bukan pembuat prosedur. Setiap perbaikan yang Anda lakukan untuk itu kirimkan ke Lowell Izaguirre ([email protected]).

Dexter Vaca
sumber
Terima kasih atas skrip dan berbagi ini! Saya akan bertanya, apakah Anda memiliki postingan di mana kita dapat membahas tentang skrip ini?
Bellash
Luar biasa! MSFT harus memiliki fungsi seperti itu di dalam Studio Manajemen
Tertium
19

Cara termudah dan tercepat yang dapat saya pikirkan adalah menggunakan sp_help

sp_help 'TableName'

codingbadger
sumber
18

Gunakan aplikasi baris perintah Windows kecil ini yang mendapatkan CREATE TABLEskrip (dengan batasan) untuk tabel apa pun. Saya telah menulisnya di C #. Cukup kompilasi dan simpan di memory stick. Mungkin seseorang bisa memindahkannya ke 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);
        }
    }
}
Anthony Faull
sumber
2
Ini bukan T-SQL
ivan_pozdeev
Saya ingin tahu apa yang akan Anda lihat jika Anda menggunakan SQL Profiler untuk menangkap perintah yang dimulai ini. : ->
Paul Smith
Hanya ingin menambahkan bahwa ini tidak akan menghapus tabel CDC apa pun :( karena saat ini tidak didukung di SMO.
H. Abraham Chavez
Saya menambahkan jawaban dengan port PowerShell. Semoga ini bisa membantu seseorang.
R. Horber
11

sp_help 'YourTableName'
Joe Stefanelli
sumber
6

Ini akan mengembalikan kolom, tipe data, dan indeks yang ditentukan pada tabel:

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

--Table Definition
sp_help TableName

Ini akan mengembalikan pemicu yang ditentukan di tabel:

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

Sejak SQL 2012 Anda dapat menjalankan pernyataan berikut:

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

Jika Anda memasukkan pernyataan pemilihan yang kompleks (bergabung, subpilih, dll), itu akan memberi Anda definisi dari kumpulan hasil. Ini sangat berguna, jika Anda perlu membuat tabel baru (atau tabel temp) dan Anda tidak ingin memeriksa setiap definisi bidang secara manual.

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

Dan Stef
sumber
4

Cukup ketik nama tabel dan pilih dan tekan ATL + F1

Katakanlah nama tabel Anda Customerlalu buka jendela kueri baru , ketik dan pilih nama tabel dan tekan ALT + F1

Ini akan menunjukkan definisi lengkap dari tabel.

Ali Adravi
sumber
Bagus)) Tapi bagi saya, ini menunjukkan data untuk seluruh database. Saya sudah mencoba jendela kueri baru dengan hanya nama tabel di dalamnya dan tidak berhasil - selalu menunjukkan semuanya. Jika tidak, tip bagus :)
FrenkyB
Saya menggunakannya dengan 2008 dan 2012, tidak yakin tentang versi yang lebih lama, dan itu selalu berfungsi untuk saya, Hanya nama tabel dan ALT + F1, jika ingin menggunakan skema maka 'schema.table'.
Ali Adravi
Ini adalah jalan pintas dari sp_help 'schema.tablename'
Ali Adravi
2
Berhasil ketika saya memilih \ menyoroti nama tabel. Menampilkan seluruh database jika ada hal lain di jendela kueri.
DB Tech
3

Variasi jawaban @Anthony Faull untuk mereka yang menggunakan LINQPad:

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

Anda harus mereferensikan 2 rakitan:

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

Dan tambahkan referensi namespace seperti yang disebutkan dalam cuplikan Anthony.

Taras Strypko
sumber
3

Saya tahu ini pertanyaan lama, tapi persis seperti yang saya cari. Karena saya ingin menumpuk skrip beberapa tabel, saya menulis ulang kode C # dari Anthony Faull untuk PowerShell.

Yang ini menggunakan Keamanan Terintegrasi:

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

Dan di sini dengan nama pengguna dan kata sandi:

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"}
R. Horber
sumber
2

Coba prosedur tersimpan sp_help.

sp_help <>

dotnetster
sumber
2

Sebagai tambahan atas jawaban Barry. Sp_help juga dapat digunakan dengan sendirinya untuk mengulang semua objek dalam database tertentu. Anda juga memiliki sp_helptext untuk gudang senjata Anda, yang menskrip elemen program, seperti prosedur tersimpan.

Gregory A Beamer
sumber
2

Cara lain adalah dengan menjalankan prosedur sp_columns .

EXEC sys.sp_columns @TABLE_NAME = 'YourTableName'

sumber
0
SELECT ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
       , IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'EMPLOYEES'
Mahmoud Saleh
sumber
-5

"Perhatikan bahwa saya benar-benar menginginkan DDL yang mendefinisikan tabel."

gunakan pg_dump:

pg_dump -s -t tablename dbname

Ini memberi Anda definisi tabel ( -shanya skema, tidak ada data) dari tabel tertentu (nama -ttab) dalam database "dbname"dalam SQL biasa. Selain itu, Anda akan mendapatkan info urutan, kunci utama, dan batasan. Output yang Anda dapat -mungkin setelah memeriksa dan mengedit sesuai dengan kebutuhan Anda- dimasukkan kembali ke database Postgres (sama atau lainnya):

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

Ini untuk UNIX / Linux, tapi saya yakin, pg_dump juga ada untuk Windows.

Norbert Poellmann
sumber
1
Tidak! ini untuk postgres bukan untuk Microsoft SQL Server.
Tandai
3
Mengabaikan seluruh platform dan mesin database yang ditentukan dalam pertanyaan. Bagus.
Jeremy