T-SQL запрос для отображения определения таблицы?



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



UPDATE: я пробовал sp_help, но это просто дает одну запись, которая показывает имя, владельца, тип и Created_Datetime. Есть что-то еще я отсутствует процедура sp_help?



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



аэропорты процедуру sp_help



обратите внимание, что я действительно хочу DDL, который определяет таблицу.

896   16  

16 ответов:

нет простого способа вернуть 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')

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

sp_help 'TableName'

используйте это маленькое приложение командной строки 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);
        }
    }
}

посещение 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, и он делает отличную работу.

Я не являюсь автором процедуры. Любое улучшение вы делаете к нему отправить Лоуэлл Изагирре ([email protected]).

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

sp_help 'TableName'

sp_help 'YourTableName'

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

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

попробуйте хранимую процедуру sp_help.

процедура sp_help

Как дополнение к ответу Барри. Процедура sp_help также может использоваться сама по себе для итерации всех объектов в определенной базе данных. У вас также есть sp_helptext для вашего арсенала, который выписывает программные элементы, такие как хранимые процедуры.

другой способ-выполнить sp_columns процедуры.

EXEC sys.sp_columns @TABLE_NAME = 'YourTableName'

просто введите имя таблицы и выберите его и нажмите ATL + F1

скажите, что ваше имя таблицы открыть новое окно запроса, введите и выберите имя таблицы и нажмите ALT + F1

он покажет полное определение таблицы.

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

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

SELECT ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
       , IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'EMPLOYEES'

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

Я знаю, это старый вопрос, но именно то, что я ищу. Поскольку я хочу пакетный сценарий некоторых таблиц, я переписал код C# от Энтони Фаулла для 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"}

"обратите внимание, что я действительно хочу DDL, который определяет таблицу."

использовать pg_dump:

pg_dump -s -t tablename dbname

это дает вам определение таблицы (-s только схема, без данных) некая таблица (-t tablename ) в базе данных "dbname" в обычном SQL. Кроме того, вы получите информацию о последовательности, первичном ключе и ограничении. Выход вы можете -возможно, после проверки и редактирования в соответствии с вашими потребностями- подаваться снова в (тот же или другой) Постгрес база данных:

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

Это для UNIX / Linux, но я уверен, что pg_dump также существует для Windows.

Comments

    Ничего не найдено.