แบบสอบถาม T-SQL เพื่อแสดงนิยามตาราง?


106

แบบสอบถามที่จะแสดงคำจำกัดความทั้งหมดรวมถึงดัชนีและคีย์สำหรับตาราง SQL Server คืออะไร ฉันต้องการคำค้นหาที่บริสุทธิ์และรู้ว่า SQL Studio สามารถให้สิ่งนี้กับฉันได้ แต่ฉันมักใช้คอมพิวเตอร์ "ป่า" ที่มีเฉพาะแอปที่ไม่มีกระดูกส่วนใหญ่และฉันไม่มีสิทธิ์ติดตั้งสตูดิโอ แต่ SQLCMD เป็นตัวเลือกเสมอ

อัปเดต: ฉันได้ลอง sp_help แล้ว แต่ให้ผลลัพธ์เพียงหนึ่งระเบียนซึ่งแสดงชื่อเจ้าของประเภทและ Created_Datetime sp_help ขาดอะไรไปอีกไหม

นี่คือสิ่งที่ฉันเรียก:

sp_help สนามบิน

โปรดทราบว่าฉันต้องการ DDL ที่กำหนดตารางจริงๆ


1
สิ่งที่คุณขาดหายไปsp_helpคือส่งคืนชุดผลลัพธ์หลายชุด คุณกำลังอธิบายคอลัมน์ที่ส่งคืนโดยชุดผลลัพธ์แรก
Joe Stefanelli

1
คำถามที่ดี. มาจาก MySQL โซลูชันนั้นสั้นเกินไปเนื่องจากไม่สามารถเห็นคอลัมน์ดัชนีคีย์ต่างประเทศชื่อข้อ จำกัด ทั้งหมดในที่เดียว สิ่งนี้รุนแรงเมื่อคุณมีฐานข้อมูล / ตารางจำนวนมากในตัวสำรวจวัตถุของคุณ หวังว่า Microsoft จะแก้ไขปัญหานี้ในอนาคต ฉันไม่ได้ใช้เครื่องมือเพิ่มประสิทธิภาพใด ๆ แต่SSMSBoostดูดี
เตอร์

1
@ Microsoft โปรดเพิ่ม DESC TABLE เช่น MySQL ง่าย. เรียบง่าย เสร็จแล้ว
Pete Alvin

คำตอบ:


129

ไม่มีวิธีง่ายๆในการส่งคืน DDL แต่คุณจะได้รับส่วนใหญ่ของรายละเอียดจากข้อมูล Schema ชมและระบบการเข้าชม

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 ทั่วไปที่จะทำเพื่อคุณ
Daniel Williams

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 และทำได้ดีมาก

ฉันไม่ใช่ผู้เขียนขั้นตอนนี้ การปรับปรุงใด ๆ ที่คุณทำส่งไปที่ Lowell Izaguirre (scripts@stormrage.com)


ขอบคุณสำหรับคริปนี้และการแบ่งปัน! ฉันจะถามคุณมีโพสต์ที่สามารถพูดคุยเกี่ยวกับสคริปต์นี้ได้หรือไม่?
Bellash

ยอดเยี่ยม! MSFT ต้องมีฟังก์ชันดังกล่าวใน Management Studio
Tertium


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 เพื่อจับคำสั่งที่เริ่มต้น : ->
Paul Smith

แค่อยากจะเพิ่มว่าสิ่งนี้จะไม่เขียนสคริปต์ตาราง CDC ใด ๆ :( เนื่องจากขณะนี้ยังไม่รองรับใน SMO
H. Abraham Chavez

ฉันเพิ่มคำตอบด้วยพอร์ต 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 ที่ซับซ้อน (การรวมการเลือกย่อย ฯลฯ ) จะให้คำจำกัดความของชุดผลลัพธ์ สิ่งนี้มีประโยชน์มากหากคุณต้องการสร้างตารางใหม่ (หรือตารางชั่วคราว) และคุณไม่ต้องการตรวจสอบนิยามฟิลด์ทุกรายการด้วยตนเอง

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"
Ali Adravi

เป็นทางลัดของ sp_help 'schema.tablename'
Ali Adravi

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

และเพิ่มการอ้างอิงเนมสเปซตามที่กล่าวไว้ในตัวอย่างข้อมูลของ Anthony


3

ฉันรู้ว่ามันเป็นคำถามเก่า แต่สิ่งที่ฉันกำลังมองหา เนื่องจากฉันต้องการจัดทำสคริปต์บางตารางฉันจึงเขียนโค้ด C # ใหม่จาก Anthony Faull สำหรับ PowerShell

อันนี้ใช้ Integrated Security:

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

นอกเหนือจากคำตอบของ Barry sp_help ยังสามารถใช้เพื่อทำซ้ำวัตถุทั้งหมดในฐานข้อมูลเฉพาะ นอกจากนี้คุณยังมี sp_helptext สำหรับคลังแสงของคุณซึ่งจะสคริปต์องค์ประกอบที่เป็นโปรแกรมเช่นกระบวนงานที่เก็บไว้


2

อีกวิธีหนึ่งคือดำเนินการขั้นตอนsp_columns

EXEC sys.sp_columns @TABLE_NAME = 'YourTableName'


-5

"โปรดทราบว่าฉันต้องการ DDL ที่กำหนดตาราง"

ใช้ pg_dump:

pg_dump -s -t tablename dbname

ให้คำจำกัดความตาราง ( -sเป็น schema เท่านั้นไม่มีข้อมูล) ของตารางบางตาราง (ชื่อตาราง-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
ไม่! สิ่งนี้มีไว้สำหรับ postgres ไม่ใช่สำหรับ Microsoft SQL Server
ทำเครื่องหมาย

3
ละเว้นทั้งแพลตฟอร์มและเอ็นจินฐานข้อมูลที่ระบุในคำถาม ดี.
Jeremy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.