テーブル定義を表示するT-SQLクエリ?


105

SQL Serverテーブルのインデックスとキーを含む完全な定義を表示するクエリとは何ですか?純粋なクエリが必要です-SQL Studioがこれを提供してくれることを知っていますが、私は多くの場合、最小限のアプリしか持たない「ワイルド」コンピュータを使用しており、スタジオをインストールする権限がありません。ただし、SQLCMDは常にオプションです。

更新:私はsp_helpを試しましたが、名前、所有者、タイプ、およびCreated_Datetimeを示す1つのレコードが生成されます。sp_helpで他に何か不足していますか?

これが私が呼ぶものです:

sp_help空港

テーブルを定義するDDLが本当に必要なことに注意してください。


1
不足しsp_helpているのは、複数の結果セットを返すことです。最初の結果セットによって返される列を記述しています。
ジョーステファネッリ

1
良い質問。MySQLから来た場合、列、インデックス、外部キー、制約名をすべて1か所で見ることができないため、ソリューションは短すぎます。オブジェクトエクスプローラーに多数のデータベース/テーブルがある場合、これは深刻です。Microsoftが将来的にこれに対処することを望みます。生産性向上ツールは使用していませんが、SSMSBoostは有望に見えます。
ピーターn

1
@MicrosoftはMySQLのようにDESC TABLEを追加してください。簡単です。シンプル。できました。
ピートアルヴィン

回答:


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を生成"するように指示するときにそれが行うことであると私は疑い始めていました。私はそうですが、あなたのためにそれを行う一般的なSPがないことに驚いています。
ダニエルウィリアムズ

6
そうです。列情報のみが必要な場合sp_columnsは、私の回答で述べたように実行できます。FKに関する情報が必要な場合は、を実行してくださいsp_fkeys。インデックスを知りたい場合はを実行してくださいsp_statistics

69

sp_helpを試しましたか?

sp_help 'TableName'

1
これは、構造、制約、制約のタイプなどを示しています。データテーブルの完全な名前を記述する必要があります。Schema.TableName。それ以外の場合は、問題を完全に解決し、テーブルに関するすべての情報を提供します。
FrenkyB 2015年

1
フルパスが書き込まれている場合でも、テーブルのDDLを返しません。
CoveGeek

25

訪問http://www.stormrage.com/SQLStuff/sp_GetDDL_Latest.txtを

sp_getddlSQL Server の手順のコードがあります。プロシージャの目的は、任意のテーブル、一時テーブル、またはオブジェクトをスクリプト化することです。

使用法:

exec sp_GetDDL GMACT

または

exec sp_GetDDL 'bob.example'

または

exec sp_GetDDL '[schemaname].[tablename]'

または

exec sp_GetDDL #temp

SQL Server 2012でテストしましたが、非常に優れています。

私は手順の著者ではありません。あなたがそれに加えた改善はすべて、ローウェル・イザギレ(scripts@stormrage.com)に送信されます。


このスクリプトと共有をありがとう!このスクリプトについて話し合うことができる投稿はありますか?
Bellash

優れた!MSFTは、Management Studio内でそのような機能を備えている必要があります
Tertium '19年


18

CREATE TABLE任意のテーブルのスクリプト(制約付き)を取得するこの小さなWindowsコマンドラインアプリを使用します。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 2014

SQLプロファイラーを使用してこれが開始されたコマンドをキャプチャした場合、何が表示されるのでしょうか。:->
ポールスミス

。ただ、それが現在SMOではサポートされていないとして、任意のCDCテーブル:(うち、この意志はないスクリプトを追加したい
H.アブラハムチャベス

PowerShellポートで回答を追加しました。これが誰かを助けることを願っています。
R. Horber、2017年


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>'

複雑な選択ステートメント(結合、副選択など)を入力すると、結果セットの定義が表示されます。これは、新しいテーブル(または一時テーブル)を作成する必要があり、すべてのフィールド定義を手動で確認したくない場合に非常に便利です。

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 2015年

私は2008と2012でそれを使用しましたが、古いバージョンについては不明ですが、常に機能します。スキーマを使用して「schema.table」を使用する場合は、テーブル名とALT + F1だけです。
Ali Adravi 2015年

これは、sp_help 'schema.tablename'のショートカットです
Ali Adravi

2
\を選択すると、テーブル名が強調表示されて機能しました。クエリウィンドウに他に何かがある場合は、データベース全体を表示しました。
DB Tech

3

LINQPadを使用する人のための@Anthony Faullの回答のバリエーション:

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

そして、Anthonyのスニペットで言及されているように名前空間参照を追加します。


3

私はそれが古い質問であることを知っていますが、まさに私が探していたものです。一部のテーブルのバッチスクリプトを実行するため、Anthony FaullからPowerShell用にC#コードを書き直しました。

これは統合セキュリティを使用しています:

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_columnsプロシージャを実行することです。

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

プレーンSQLのデータベース内の-s特定のテーブル(-ttablename)のテーブル定義(スキーマのみで、データはありません)を提供し"dbname"ます。さらに、シーケンス、主キー、および制約情報を取得します。あなたができる出力-おそらくあなたの必要に応じてチェックして編集した後-は(同じまたは別の)Postgresデータベースに再び送られます:

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

これはUNIX / Linux用ですが、Windowsにもpg_dumpが存在することを確信しています。


1
番号!これはMicrosoft SQL Serverではなくpostgres用です。
マーク

3
質問で指定されたプラットフォームとデータベースエンジン全体を無視します。いいね。
ジェレミー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.