Запрос T-SQL для отображения определения таблицы?
Что такое запрос, который покажет мне полное определение, включая индексы и ключи для таблицы SQL Server? Я хочу получить чистый запрос - и знаю, что SQL Studio может дать это мне, но я часто на "диких" компьютерах, которые имеют только самые голые приложения, и у меня нет прав на установку студии. Но SQLCMD всегда является опцией.
UPDATE: я попробовал sp_help, но просто выводит одну запись, которая показывает имя, владелец, тип и Created_Datetime. Есть что-то еще, что мне не хватает с sp_help?
Вот что я называю:
sp_help аэропорты
Обратите внимание, что я действительно хочу, чтобы DDL определял таблицу.
Ответы
Ответ 1
Нет простого способа вернуть 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')
Ответ 2
Вы пробовали sp_help?
sp_help 'TableName'
Ответ 3
Используйте это небольшое приложение для командной строки Windows, которое получает CREATE TABLE
script (с ограничениями) для любой таблицы. Я написал это на С#. Просто скомпилируйте его и переносите на карту памяти. Возможно, кто-то может отправить его в 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);
}
}
}
Ответ 4
Посетите http://www.stormrage.com/SQLStuff/sp_GetDDL_Latest.txt.
Вы найдете код процедуры sp_getddl
для SQL Server.
Целью этой процедуры является script любая таблица, временная таблица или объект.
ПРИМЕНЕНИЕ:
exec sp_GetDDL GMACT
или
exec sp_GetDDL 'bob.example'
или
exec sp_GetDDL '[schemaname].[tablename]'
или
exec sp_GetDDL #temp
Я тестировал его на SQL Server 2012, и он отлично справляется.
Я не автор процедуры. Любое улучшение, которое вы делаете, отправляется в Лоуэлл Изагирре ([email protected]).
Ответ 5
Самый простой и быстрый способ, который я могу придумать, - использовать sp_help
sp_help 'TableName'
Ответ 6
sp_help 'YourTableName'
Ответ 7
Это вернет столбцы, типы данных и индексы, определенные в таблице:
--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')
Ответ 8
Попробуйте хранимую процедуру sp_help.
sp_help < >
Ответ 9
В качестве дополнения к ответу Барри. Sp_help также может использоваться сам по себе для итерации всех объектов в конкретной базе данных. У вас также есть sp_helptext для вашего арсенала, который скриптирует программные элементы, такие как хранимые процедуры.
Ответ 10
Другой способ - выполнить процедуру sp_columns.
EXEC sys.sp_columns @TABLE_NAME = 'YourTableName'
Ответ 11
Просто введите имя таблицы и выберите ее и нажмите ATL + F1
Скажите, что имя вашей таблицы Customer
, затем откройте новое окно запроса, введите и выберите имя таблицы и нажмите ALT + F1
Покажет полное определение таблицы.
Ответ 12
Вариант ответа @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
И добавьте ссылки пространства имен, упомянутые в фрагменте Энтони.
Ответ 13
SELECT ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
, IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'EMPLOYEES'
Ответ 14
Начиная с 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
Ответ 15
Я знаю, что это старый вопрос, но именно то, что я искал. Поскольку я хочу выгрузить script некоторые таблицы, я переписал код С# от 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"}
Ответ 16
"Обратите внимание, что я действительно хочу, чтобы DDL определял таблицу."
используйте pg_dump:
pg_dump -s -t tablename dbname
Он дает вам определение таблицы (-s
- только схема, без данных)
определенную таблицу (-t
tablename) в базе данных "dbname"
в простом SQL.
Кроме того, вы получите информацию о последовательности, первичных ключах и ограничениях.
Результат, который вы можете получить после проверки и редактирования в соответствии с вашими потребностями,
снова загружаться в (то же или другое) базу данных Postgres:
pg_dump -s -t tablename dbname1 > /tmp/foo.sql
psql -e dbname2 < /tmp/foo.sql
Это для UNIX/Linux, но я уверен, что pg_dump также существует для Windows.