T-SQL запрос, чтобы показать определение таблицы? - PullRequest
98 голосов
/ 02 июня 2011

Что такое запрос, который покажет мне полное определение, включая индексы и ключи для таблицы SQL Server?Я хочу чистый запрос - и знаю, что SQL Studio может дать мне это, но я часто на «диких» компьютерах, которые имеют только самые простые приложения, и у меня нет прав на установку студии.Но SQLCMD всегда является опцией.

ОБНОВЛЕНИЕ: я пробовал sp_help, но просто возвращает одну запись, которая показывает Имя, Владелец, Тип и Created_Datetime.Есть ли еще что-то, чего мне не хватает в sp_help?

Вот что я называю:

sp_help airport *

Обратите внимание, что мне действительно нужен DDL, определяющий таблицу.

Ответы [ 16 ]

110 голосов
/ 02 июня 2011

Нет простого способа вернуть 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')
63 голосов
/ 02 июня 2011

Вы пробовали sp_help?

sp_help 'TableName'
21 голосов
/ 15 июля 2015

Посетите 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, и он отлично справляется со своей работой.

Я не являюсь автором процедуры.Все улучшения, которые вы вносите в него, отправляйте Лоуэллу Изагирре (scripts@stormrage.com).

19 голосов
/ 03 июня 2011

Используйте это небольшое приложение для командной строки 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);
        }
    }
}
16 голосов
/ 02 июня 2011

Самый простой и быстрый способ, которым я могу придумать, это использовать sp_help

sp_help 'TableName'

9 голосов
/ 02 июня 2011

sp_help 'YourTableName'
6 голосов
/ 02 июня 2011

Это вернет столбцы, типы данных и индексы, определенные в таблице:

--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') 
4 голосов
/ 05 мая 2017

Начиная с 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

3 голосов
/ 29 ноября 2017

Я знаю, что это старый вопрос, но именно то, что я искал.Поскольку я хочу выполнить пакетную обработку некоторых таблиц, я переписал код C # из Anthony Faull для PowerShell.

Этот использует встроенную безопасность:

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"}
3 голосов
/ 28 января 2016

Вариант ответа @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

И добавьте ссылки на пространства имен, как указано во фрагменте Энтони.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...