什么是将向我显示完整定义的查询,包括SQL Server表的索引和键?我想要一个纯粹的查询 - 并且知道SQL Studio可以给我这个,但我经常在“狂野”的计算机上,只有最简单的应用程序,我没有权利安装工作室。但是SQLCMD总是一个选择。
更新:我尝试过sp_help,但只生成一条显示Name,Owner,Type和Created_Datetime的记录。 sp_help还有其他我缺少的东西吗?
这就是我所说的:
sp_help机场
请注意,我确实需要定义表的DDL。
答案 0 :(得分:106)
没有简单的方法可以返回DDL。但是,您可以从Information Schema Views和System Views获取大部分详细信息。
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 :(得分:62)
你试过sp_help吗?
sp_help 'TableName'
答案 2 :(得分:20)
访问http://www.stormrage.com/SQLStuff/sp_GetDDL_Latest.txt。
您将找到SQL Server的sp_getddl
过程的代码。
该过程的目的是脚本任何表,临时表或对象。
用法:
exec sp_GetDDL GMACT
或
exec sp_GetDDL 'bob.example'
或
exec sp_GetDDL '[schemaname].[tablename]'
或
exec sp_GetDDL #temp
我在SQL Server 2012上测试过,它做得很好。
我不是该程序的作者。您对它所做的任何改进都会发送给Lowell Izaguirre(scripts@stormrage.com)。
答案 3 :(得分:19)
使用这个小的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);
}
}
}
答案 4 :(得分:15)
我能想到的最简单,最快捷的方法是使用sp_help
sp_help 'TableName'
答案 5 :(得分:8)
sp_help 'YourTableName'
答案 6 :(得分:6)
这将返回表中定义的列,数据类型和索引:
--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')
答案 7 :(得分:3)
只需输入表格名称并选择它,然后按ATL + F1
假设您的表名为Customer
,然后打开新查询窗口,输入并选择表名并按ALT + F1
它将显示表的完整定义。
答案 8 :(得分:3)
@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个程序集:
添加命名空间引用,如Anthony的片段中所述。
答案 9 :(得分:3)
从SQL 2012开始,您可以运行以下语句:
Exec sp_describe_first_result_set @tsql= N'Select * from <yourtable>'
如果输入复杂的select语句(连接,子选择等),它将为您提供结果集的定义。如果您需要创建一个新表(或临时表)并且不想手动检查每个字段定义,这非常方便。
答案 10 :(得分:3)
我知道这是一个老问题,但正是我所寻找的。因为我想批量编写一些表脚本,所以我重写了来自Anthony Faull的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"}
答案 11 :(得分:2)
另一种方法是执行sp_columns程序。
EXEC sys.sp_columns @TABLE_NAME = 'YourTableName'
答案 12 :(得分:2)
作为巴里答案的补充。 sp_help本身也可以用于迭代特定数据库中的所有对象。你的武器库也有sp_helptext,它编写了程序化元素,如存储过程。
答案 13 :(得分:2)
尝试使用sp_help存储过程。
sp_help&lt;&gt;
答案 14 :(得分:0)
SELECT ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
, IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'EMPLOYEES'
答案 15 :(得分:0)
使用存储过程 sp_help
显示通用表定义,如前所述:
sp_help 'table_name_in_current_db_context'
当使用多个上下文的表时,将所需的上下文作为上述命令的前缀很有用,而不是用 use db_xyz
更改它们:
DB_Products..sp_help 'MyTable' -- 用于在 DB_Products 中定义 MyTable
它也适用于临时表:
<块引用>tempdb..sp_help '#TempTable' -- 用于在当前上下文中定义 #TempTable。
答案 16 :(得分:-4)
&#34;请注意,我确实需要定义表的DDL。&#34;
使用pg_dump:
pg_dump -s -t tablename dbname
它为您提供了表定义(-s
仅为架构,无数据)
普通SQL中数据库-t
中的某个表("dbname"
tablename)。
此外,您将获得序列,主键和约束信息。
根据您的需要检查和编辑后,您可以输出 -
再次喂入(相同或另一个)Postgres数据库:
pg_dump -s -t tablename dbname1 > /tmp/foo.sql
psql -e dbname2 < /tmp/foo.sql
这适用于UNIX / Linux,但我确定,Windows也存在pg_dump。