Tablo tanımını göstermek için T-SQL sorgusu?


105

Bir SQL Server tablosu için dizinler ve anahtarlar dahil olmak üzere bana tam tanımı gösterecek bir sorgu nedir? Saf bir sorgu istiyorum - ve SQL Studio'nun bunu bana verebileceğini biliyorum, ancak genellikle yalnızca en çıplak uygulamaların bulunduğu "vahşi" bilgisayarlarda bulunuyorum ve stüdyo yükleme hakkım yok. Ancak SQLCMD her zaman bir seçenektir.

GÜNCELLEME: sp_help'i denedim, ancak yalnızca Ad, Sahip, Tür ve Oluşturulan_Tarihi gösteren bir kayıt veriyor. Sp_help ile özlediğim başka bir şey var mı?

İşte ben böyle çağırıyorum:

sp_help havaalanları

Tabloyu tanımlayan DDL'yi gerçekten istediğime dikkat edin.


1
Eksik olan sp_helpşey, birden çok sonuç kümesi döndürmesidir. İlk sonuç kümesi tarafından döndürülen sütunları tanımlıyorsunuz.
Joe Stefanelli

1
İyi soru. MySQL'den gelince, çözümler çok kısa kalıyor, çünkü biri sütunları, indeksleri, yabancı anahtarları, kısıtlama isimlerini tek bir yerde göremiyor. Nesne gezgininizde çok sayıda veritabanı / tablonuz olduğunda bu ciddi bir durumdur. Umarım Microsoft bunu gelecekte ele alır. Herhangi bir üretkenlik aracı kullanmadım ancak SSMSBoost umut verici görünüyor.
peter

1
@Microsoft lütfen MySQL gibi DESC TABLE ekleyin. Kolay. Basit. Bitti.
Pete Alvin

Yanıtlar:


127

DDL'yi iade etmenin kolay bir yolu yoktur. Bununla birlikte, ayrıntıların çoğunu Bilgi Şeması Görünümlerinden ve Sistem Görünümlerinden alabilirsiniz .

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
Teşekkür ederim. Bunu elde etmenin tek yolunun bir dizi ayrı tabloya sorgulama yapmak olduğundan ve SQL Studio'nun "DDL oluştur" dediğinde yaptığı şeyin bu olduğundan şüphelenmeye başlamıştım. Bunu sizin için yapacak genel bir SP olmamasına şaşırdım.
Daniel Williams

6
Bu. Sadece sütun bilgilerini istiyorsanız, cevabımda sp_columnsbahsettiğim gibi çalıştırabilirsiniz . FK'ler hakkında bilgi almak istiyorsanız çalıştırın sp_fkeys. Dizinleri bilmek istiyorsanız, çalıştırın sp_statistics.

69

Sp_help'i denediniz mi?

sp_help 'TableName'

1
Bu, yapıyı, kısıtlamaları, kontraint türlerini vb. Gösterir. Unutulmaması gereken bir şey var: datatable'ın tam adını yazmalısınız. Schema.TableName. Aksi takdirde problemi tamamen çözer ve tablo ile ilgili tüm bilgileri verir.
FrenkyB

1
Tam yol yazılmış olsa bile tablonun DDL'sini döndürmez.
CoveGeek

25

Http://www.stormrage.com/SQLStuff/sp_GetDDL_Latest.txt adresini ziyaret edin .

sp_getddlSQL Server için prosedür kodunu bulacaksınız . Prosedürün amacı herhangi bir tabloyu, geçici tabloyu veya nesneyi kodlamaktır.

KULLANIM:

exec sp_GetDDL GMACT

veya

exec sp_GetDDL 'bob.example'

veya

exec sp_GetDDL '[schemaname].[tablename]'

veya

exec sp_GetDDL #temp

SQL Server 2012'de test ettim ve mükemmel bir iş çıkarıyor.

Prosedürün yazarı ben değilim. Yaptığınız herhangi bir iyileştirmeyi Lowell Izaguirre'a (scripts@stormrage.com) gönderir.


Bu senaryo ve paylaşım için teşekkürler! Soruyorum, bu senaryo hakkında tartışabileceğimiz bir gönderiniz var mı?
Bellash

Mükemmel! MSFT, Management Studio içinde böyle bir işleve sahip olmalıdır
Tertium


18

CREATE TABLEHerhangi bir tablo için komut dosyasını (kısıtlamalarla) alan bu küçük Windows komut satırı uygulamasını kullanın . Bunu C # ile yazdım. Sadece derleyin ve bir hafıza çubuğunda taşıyın. Belki birisi onu Powershell'e taşıyabilir.

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
Gerçi bu T-SQL değil
ivan_pozdeev

Bu başlatılan komutları yakalamak için SQL Profiler'ı kullanırsanız ne görürdünüz acaba? : ->
Paul Smith

Bunun herhangi bir CDC tablosunun komut dosyasını oluşturmayacağını eklemek istedim :( şu anda SMO'da desteklenmediği için.
H. Abraham Chavez

PowerShell bağlantı noktasıyla bir yanıt ekledim. Umarım bu birine yardımcı olur.
R. Horber


6

Bu, tabloda tanımlanan sütunları, veri türlerini ve dizinleri döndürür:

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

--Table Definition
sp_help TableName

Bu, tabloda tanımlanan tetikleyicileri döndürür:

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

6

SQL 2012'den beri aşağıdaki ifadeyi çalıştırabilirsiniz:

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

Karmaşık bir seçim ifadesi girerseniz (birleşimler, alt seçimler vb.), Size sonuç kümesinin tanımını verecektir. Yeni bir tablo (veya geçici tablo) oluşturmanız gerekiyorsa ve her bir alan tanımını manuel olarak kontrol etmek istemiyorsanız, bu çok kullanışlıdır.

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


4

Basitçe tablo adını yazıp seçin ve ATL + F1 tuşlarına basın

Tablo adınızı söyleyin ve Customerardından yeni bir sorgu penceresi açın , tablo adını yazın ve seçin ve ALT + F1 tuşlarına basın

Tablonun tam tanımını gösterecektir.


İyi bir)) Ama benim için tüm veritabanı için verileri gösteriyor. İçinde sadece tablo adı olan yeni sorgu pencereleri denedim ve çalışmıyor - her zaman her şeyi gösteriyor. Aksi takdirde, güzel ipucu :)
FrenkyB

Bunu 2008 ve 2012 ile kullandım, eski sürümlerden emin değilim ve her zaman benim için çalışıyor, Sadece tablo adı ve ALT + F1, şemayı kullanmak istiyorsanız 'schema.table'.
Ali Adravi

Bu sp_help 'schema.tablename' kısayoludur
Ali Adravi

2
Tablo adını seçtiğimde \ vurgulandı. Sorgu penceresinde başka bir şey varsa tüm veritabanını gösterdi.
DB Tech

3

LINQPad kullananlar için @Anthony Faull'un cevabının bir varyasyonu:

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

2 derlemeye başvurmanız gerekecek:

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

Ve Anthony'nin ön bilgisinde belirtildiği gibi ad alanı referansları ekleyin.


3

Bunun eski bir soru olduğunu biliyorum, ama tam olarak aradığım şey. Bazı tabloları toplu olarak komut dosyası haline getirmek istediğim için, PowerShell için Anthony Faull'dan C # kodunu yeniden yazdım.

Bu, Entegre Güvenliği kullanır:

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

Ve burada kullanıcı adı ve şifre ile:

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

Barry'nin cevabına ek olarak. Sp_help, belirli bir veritabanındaki tüm nesneleri yinelemek için kendi başına da kullanılabilir. Ayrıca cephaneliğiniz için, depolanmış prosedürler gibi programatik öğeleri betimleyen sp_helptext'e de sahipsiniz.


2

Başka bir yol da sp_columns prosedürünü yürütmektir .

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

"Tabloyu tanımlayan DDL'yi gerçekten istediğime dikkat edin."

pg_dump kullanın:

pg_dump -s -t tablename dbname

Size düz SQL'de veritabanındaki -sbelirli bir tablonun (tablo adı) tablo tanımını ( sadece şema, veri yok) verir . Ek olarak, sıra, birincil anahtar ve kısıtlama bilgilerini alacaksınız. Gereksinimlerinize göre kontrol edip düzenledikten sonra yapabileceğiniz çıktı (aynı veya başka) Postgres veritabanına tekrar beslenebilir:-t"dbname"

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

Bu UNIX / Linux içindir, ancak eminim ki Windows için de bir pg_dump vardır.


1
Hayır! bu Microsoft SQL Server için değil postgres içindir.
Mark

3
Soruda belirtilen tüm platformu ve veritabanı motorunu göz ardı etmek. Güzel.
Jeremy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.