테이블 정의를 표시하는 T-SQL 쿼리?


105

SQL Server 테이블의 인덱스 및 키를 포함하여 전체 정의를 표시하는 쿼리는 무엇입니까? 저는 순수한 쿼리를 원합니다. SQL Studio가이를 제공 할 수 있다는 것을 알고 있지만, 대부분의 기본 앱만 있고 Studio를 설치할 권한이없는 "야생적인"컴퓨터를 자주 사용합니다. 그러나 SQLCMD는 항상 옵션입니다.

업데이트 : sp_help를 시도했지만 이름, 소유자, 유형 및 Created_Datetime을 보여주는 하나의 레코드 만 생성됩니다. sp_help에서 누락 된 다른 것이 있습니까?

내가 부르는 것은 다음과 같습니다.

sp_help 공항

테이블을 정의하는 DDL이 정말로 필요합니다.


1
당신이 놓친 sp_help것은 여러 결과 세트를 반환한다는 것입니다. 첫 번째 결과 집합에서 반환 된 열을 설명하고 있습니다.
Joe Stefanelli 2011-06-02

1
좋은 질문. MySQL에서 온 솔루션은 너무 짧습니다. 열, 인덱스, 외래 키, 제약 조건 이름을 모두 한곳에서 볼 수 없기 때문입니다. 개체 탐색기에 많은 데이터베이스 / 테이블이있는 경우 이는 심각합니다. Microsoft가 앞으로이 문제를 해결하기를 바랍니다. 생산성 도구를 사용하지 않았지만 SSMSBoost 는 유망 보입니다.
peter n

1
@Microsoft는 MySQL과 같은 DESC TABLE을 추가하십시오. 쉬운. 단순한. 끝난.
Pete Alvin

답변:


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
감사합니다. 나는 이것을 얻을 수있는 유일한 방법은 다수의 개별 테이블을 쿼리하는 것이며, "DDL 생성"을 지시 할 때 SQL Studio가하는 일이라고 의심하기 시작했습니다. 나는 당신을 위해 그것을 할 일반적인 SP가 없다는 것에 놀랐습니다.
Daniel Williams

6
그것은. 열 정보 만 원하면 sp_columns내 답변에서 언급 한대로 실행할 수 있습니다 . FK에 대한 정보를 원한다면 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_getddlSQL Server에 대한 절차 코드를 찾을 수 있습니다. 절차의 목적은 모든 테이블, 임시 테이블 또는 개체를 스크립팅하는 것입니다.

용법:

exec sp_GetDDL GMACT

또는

exec sp_GetDDL 'bob.example'

또는

exec sp_GetDDL '[schemaname].[tablename]'

또는

exec sp_GetDDL #temp

SQL Server 2012에서 테스트했으며 훌륭한 작업을 수행합니다.

나는 절차의 저자가 아닙니다. 개선 사항은 Lowell Izaguirre (scripts@stormrage.com)로 보냅니다.


이 스크립트와 공유에 감사드립니다! 이 스크립트에 대해 토론 할 수있는 게시물이 있습니까?
Bellash

우수한! MSFT는 Management Studio
Tertium


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

이 시작된 명령을 캡처하기 위해 SQL 프로파일 러를 사용했다면 무엇을 보게 될지 궁금합니다. :->
Paul Smith

. 다만 그것이 현재 SMO에서 지원되지 않는 어떠한 CDC 테이블 :( 아웃이하지 않습니다 스크립트를 추가하고 싶었
H. 아브라함 차베스

PowerShell 포트로 답변을 추가했습니다. 이것이 누군가를 돕기를 바랍니다.
R. Horber


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 문 (joins, subselects 등)을 입력하면 결과 집합의 정의가 제공됩니다. 새 테이블 (또는 임시 테이블)을 만들어야하고 모든 단일 필드 정의를 수동으로 확인하지 않으려는 경우 매우 편리합니다.

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에서 사용했지만 이전 버전에 대해서는 확실하지 않았으며 스키마를 사용하려면 'schema.table'을 사용하려면 항상 테이블 이름과 ALT + F1로 작동합니다.
Ali Adravi 2015 년

그것은 '은 schema.tablename'sp_help는의 바로 가기입니다
알리 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_help <>


2

Barry의 답변에 추가로. 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

데이터베이스 에 -s있는 특정 테이블 ( -ttablename) 의 테이블 정의 ( 스키마 만, 데이터 없음)를 "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가 아닌 postgres 용입니다.
Mark

3
질문에 지정된 전체 플랫폼 및 데이터베이스 엔진을 무시합니다. 좋은.
Jeremy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.