Truy vấn T-SQL để hiển thị định nghĩa bảng?


105

Truy vấn sẽ hiển thị cho tôi định nghĩa đầy đủ, bao gồm chỉ mục và khóa cho bảng SQL Server là gì? Tôi muốn một truy vấn thuần túy - và biết rằng SQL Studio có thể cung cấp điều này cho tôi, nhưng tôi thường sử dụng các máy tính "hoang dã" chỉ có các ứng dụng đơn giản nhất và tôi không có quyền cài đặt studio. Nhưng SQLCMD luôn là một tùy chọn.

CẬP NHẬT: Tôi đã thử sp_help, nhưng chỉ mang lại một bản ghi hiển thị Tên, Chủ sở hữu, Loại và Created_Datetime. Có điều gì khác mà tôi đang thiếu với sp_help không?

Đây là những gì tôi gọi:

các sân bay sp_help

Lưu ý rằng tôi thực sự muốn DDL xác định bảng.


1
Những gì bạn đang thiếu sp_helplà nó trả về nhiều tập kết quả. Bạn đang mô tả các cột được trả về bởi tập kết quả đầu tiên.
Joe Stefanelli

1
Câu hỏi hay. Đến từ MySQL, các giải pháp quá ngắn, khiến người ta không thể nhìn thấy các cột, chỉ mục, khóa ngoại, tên ràng buộc ở cùng một nơi. Điều này rất nghiêm trọng khi bạn có nhiều cơ sở dữ liệu / bảng trong trình khám phá đối tượng của mình. Hy vọng Microsoft giải quyết vấn đề này trong tương lai. Tôi chưa sử dụng bất kỳ công cụ năng suất nào nhưng SSMSBoost có vẻ đầy hứa hẹn.
peter n

1
@Microsoft vui lòng thêm BẢNG MÔ TẢ như MySQL. Dễ dàng. Đơn giản. Làm xong.
Pete Alvin

Câu trả lời:


127

Không có cách nào dễ dàng để trả lại DDL. Tuy nhiên, bạn có thể nhận được hầu hết các chi tiết từ Chế độ xem lược đồ thông tinChế độ xem hệ thống .

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
Cảm ơn bạn. Tôi bắt đầu nghi ngờ rằng cách duy nhất để có được điều này là truy vấn vào một số bảng riêng biệt và đó là những gì SQL Studio thực hiện khi bạn yêu cầu nó "tạo DDL". Tôi nhưng ngạc nhiên là không có SP chung nào làm được điều đó cho bạn.
Daniel Williams

6
Nó là. Nếu bạn chỉ muốn thông tin cột, bạn có thể thực hiện sp_columnsnhư tôi đã đề cập trong câu trả lời của mình. Nếu bạn muốn thông tin về FKs chạy sp_fkeys. Nếu bạn muốn biết các chỉ mục, hãy thực thi sp_statistics.

69

Bạn đã thử sp_help chưa?

sp_help 'TableName'

1
Điều này cho thấy cấu trúc, các ràng buộc, các loại đối chiếu, v.v. Chỉ cần lưu ý một điều: bạn phải viết đầy đủ tên của dữ liệu. Schema.TableName. Nếu không, nó hoàn toàn giải quyết được vấn đề và cung cấp tất cả thông tin về bảng.
FrenkyB

1
Không trả về DDL của bảng, ngay cả khi đã viết đường dẫn đầy đủ.
CoveGeek

25

Truy cập http://www.stormrage.com/SQLStuff/sp_GetDDL_Latest.txt .

Bạn sẽ tìm thấy mã sp_getddlthủ tục cho SQL Server. Mục đích của thủ tục là tập lệnh cho bất kỳ bảng nào, bảng tạm thời hoặc đối tượng.

SỬ DỤNG:

exec sp_GetDDL GMACT

hoặc là

exec sp_GetDDL 'bob.example'

hoặc là

exec sp_GetDDL '[schemaname].[tablename]'

hoặc là

exec sp_GetDDL #temp

Tôi đã thử nghiệm nó trên SQL Server 2012 và nó hoạt động rất xuất sắc.

Tôi không phải là tác giả của thủ tục. Bất kỳ cải tiến nào bạn thực hiện với nó, hãy gửi đến Lowell Izaguirre (scripts@stormrage.com).


Cảm ơn bạn vì kịch bản và chia sẻ này! Tôi muốn hỏi, bạn có một bài đăng để chúng ta có thể thảo luận về kịch bản này không?
Bellash

Thông minh! MSFT phải có chức năng như vậy bên trong Management Studio
Tertium


18

Sử dụng ứng dụng dòng lệnh Windows nhỏ này để lấy CREATE TABLEtập lệnh (có ràng buộc) cho bất kỳ bảng nào. Tôi đã viết nó bằng C #. Chỉ cần biên dịch nó và mang nó vào thẻ nhớ. Có lẽ ai đó có thể chuyển nó sang 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
Đây không phải là T-SQL dù
ivan_pozdeev

Tôi tự hỏi bạn sẽ thấy gì nếu bạn sử dụng SQL Profiler để nắm bắt các lệnh khởi động này. : ->
Paul Smith

Chỉ muốn nói thêm rằng điều này sẽ không kịch bản ra bất kỳ bảng CDC :( như nó hiện chưa được hỗ trợ trong SMO.
H. Abraham Chavez

Tôi đã thêm câu trả lời bằng cổng PowerShell. Hy vọng điều này sẽ giúp ai đó.
R. Horber


6

Thao tác này sẽ trả về các cột, kiểu dữ liệu và chỉ mục được xác định trên bảng:

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

--Table Definition
sp_help TableName

Điều này sẽ trả về các trình kích hoạt được xác định trên bảng:

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

6

Kể từ SQL 2012, bạn có thể chạy câu lệnh sau:

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

Nếu bạn nhập một câu lệnh chọn phức tạp (nối, chọn con, v.v.), nó sẽ cung cấp cho bạn định nghĩa của tập kết quả. Điều này rất tiện dụng, nếu bạn cần tạo một bảng mới (hoặc bảng tạm thời) và bạn không muốn kiểm tra từng định nghĩa trường theo cách thủ công.

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


4

Chỉ cần nhập tên bảng và chọn nó và nhấn ATL + F1

Nói tên bảng của bạn Customersau đó mở một cửa sổ truy vấn mới , nhập và chọn tên bảng và nhấn ALT + F1

Nó sẽ hiển thị định nghĩa đầy đủ của bảng.


Tốt)) Nhưng đối với tôi, nó hiển thị dữ liệu cho toàn bộ cơ sở dữ liệu. Tôi đã thử các cửa sổ truy vấn mới chỉ có tên bảng trong đó và nó không hoạt động - nó luôn hiển thị mọi thứ. Nếu không, mẹo hay :)
FrenkyB

Tôi đã sử dụng nó với năm 2008 và 2012, không chắc chắn về các phiên bản cũ hơn, và nó luôn hoạt động với tôi, Chỉ cần tên bảng và ALT + F1, nếu muốn sử dụng lược đồ thì hãy dùng 'schema.table'.
Ali Adravi

Đó là các phím tắt của sp_help 'schema.tablename'
Ali Adravi

2
Hoạt động khi tôi đã chọn \ đánh dấu tên bảng. Hiển thị toàn bộ cơ sở dữ liệu nếu có bất kỳ thứ gì khác trong cửa sổ truy vấn.
DB Tech

3

Một biến thể của câu trả lời của @Anthony Faull dành cho những người sử dụng LINQPad:

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

Bạn sẽ cần tham khảo 2 hội đồng:

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

Và thêm các tham chiếu không gian tên như đã đề cập trong đoạn trích của Anthony.


3

Tôi biết đó là một câu hỏi cũ, nhưng chính xác là những gì tôi đang tìm kiếm. Vì tôi muốn tập lệnh hàng loạt cho một số bảng, tôi đã viết lại mã C # từ Anthony Faull cho PowerShell.

Cái này sử dụng Bảo mật tích hợp:

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

Và đây với tên người dùng và mật khẩu:

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

Như một sự bổ sung cho câu trả lời của Barry. Chính sp_help cũng có thể được sử dụng để lặp lại tất cả các đối tượng trong một cơ sở dữ liệu cụ thể. Bạn cũng có sp_helptext cho kho vũ khí của mình, nó sẽ viết ra các phần tử có lập trình, như các thủ tục được lưu trữ.


2

Một cách khác là thực hiện thủ tục 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

"Lưu ý rằng tôi thực sự muốn DDL xác định bảng."

sử dụng pg_dump:

pg_dump -s -t tablename dbname

Nó cung cấp cho bạn định nghĩa bảng (chỉ -slà giản đồ, không có dữ liệu) của một bảng nhất định (tên bảng -t) trong cơ sở dữ liệu "dbname"bằng SQL thuần túy. Ngoài ra, bạn sẽ nhận được thông tin về trình tự, khóa chính và ràng buộc. Kết quả đầu ra bạn có thể - có thể sau khi kiểm tra và chỉnh sửa theo yêu cầu của bạn - được đưa lại vào (giống nhau hoặc khác) cơ sở dữ liệu Postgres:

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

Điều này dành cho UNIX / Linux, nhưng tôi chắc chắn rằng pg_dump cũng tồn tại cho Windows.


1
Không! điều này dành cho postgres không dành cho Microsoft SQL Server.
Đánh dấu

3
Bỏ qua toàn bộ nền tảng và công cụ cơ sở dữ liệu được chỉ định trong câu hỏi. Đẹp.
Jeremy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.