T-SQL запрос для отображения определения таблицы?
Что такое запрос, который покажет мне полное определение, включая индексы и ключи для таблицы SQL Server? Я хочу чистый запрос-и знаю, что SQL Studio может дать мне это, но я часто нахожусь на "диких" компьютерах, у которых есть только самые голые приложения, и у меня нет прав на установку studio. Но SQLCMD-это всегда вариант.
UPDATE: я пробовал sp_help, но это просто дает одну запись, которая показывает имя, владельца, тип и Created_Datetime. Есть что-то еще я отсутствует процедура sp_help?
вот что я называю:
аэропорты процедуру sp_help
обратите внимание, что я действительно хочу DDL, который определяет таблицу.
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')
используйте это маленькое приложение командной строки 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'
это вернет столбцы, типы данных и индексы, определенные в таблице:
--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_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 (соединения, подзапросы и т. д.), Он даст вам определение результирующего набора. Это очень удобно, если вам нужно создать новую таблицу (или временную таблицу), и вы не хотите проверять каждое определение поля вручную.
Я знаю, это старый вопрос, но именно то, что я ищу. Поскольку я хочу пакетный сценарий некоторых таблиц, я переписал код 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только схема, без данных) некая таблица (-ttablename ) в базе данных"dbname"в обычном SQL. Кроме того, вы получите информацию о последовательности, первичном ключе и ограничении. Выход вы можете -возможно, после проверки и редактирования в соответствии с вашими потребностями- подаваться снова в (тот же или другой) Постгрес база данных:pg_dump -s -t tablename dbname1 > /tmp/foo.sql psql -e dbname2 < /tmp/foo.sqlЭто для UNIX / Linux, но я уверен, что pg_dump также существует для Windows.
Comments