什么是查询可以向我显示完整的定义,包括SQL Server表的索引和键?我想要一个纯查询-并且知道SQL Studio可以提供给我,但是我经常在“野生”计算机上,这些计算机只有最简单的应用程序,并且我无权安装Studio。但是SQLCMD始终是一个选择。
更新:我已经尝试了sp_help,但是只产生一条记录,显示名称,所有者,类型和Created_Datetime。我还缺少sp_help吗?
这就是我所说的:
sp_help机场
请注意,我确实希望使用定义表的DDL。
什么是查询可以向我显示完整的定义,包括SQL Server表的索引和键?我想要一个纯查询-并且知道SQL Studio可以提供给我,但是我经常在“野生”计算机上,这些计算机只有最简单的应用程序,并且我无权安装Studio。但是SQLCMD始终是一个选择。
更新:我已经尝试了sp_help,但是只产生一条记录,显示名称,所有者,类型和Created_Datetime。我还缺少sp_help吗?
这就是我所说的:
sp_help机场
请注意,我确实希望使用定义表的DDL。
Answers:
没有简单的方法可以返回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')
您是否尝试过sp_help?
sp_help 'TableName'
请访问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上对其进行了测试,它表现出色。
我不是程序的作者。您对此的任何改进都会发送到Lowell Izaguirre(scripts@stormrage.com)。
使用这个小的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);
}
}
}
sp_help 'YourTableName'
从SQL 2012开始,您可以运行以下语句:
Exec sp_describe_first_result_set @tsql= N'Select * from <yourtable>'
如果输入复杂的select语句(联接,子选择等),它将为您提供结果集的定义。如果您需要创建一个新表(或临时表)并且不想手动检查每个字段定义,这非常方便。
只需键入表名称并选择它,然后按ATL + F1
说您的表名,Customer
然后打开一个新的查询窗口,键入并选择表名,然后按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个程序集:
并按Anthony的代码片段所述添加名称空间引用。
我知道这是一个老问题,但正是我想要的。因为我想批处理某些表的脚本,所以我重写了Anthony Faull的PowerShell的C#代码。
这是使用集成安全性:
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"}
另一种方法是执行sp_columns过程。
EXEC sys.sp_columns @TABLE_NAME = 'YourTableName'
SELECT ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
, IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'EMPLOYEES'
“请注意,我确实希望使用定义表的DDL。”
使用pg_dump:
pg_dump -s -t tablename dbname
它以纯SQL的形式为您提供数据库中-s
某个表(-t
tablename)的表定义(仅架构,无数据)"dbname"
。此外,您还将获得序列,主键和约束信息。您可以输出的输出-可能是在根据需要进行检查和编辑之后-再次输入到(相同或另一个)Postgres数据库中:
pg_dump -s -t tablename dbname1 > /tmp/foo.sql
psql -e dbname2 < /tmp/foo.sql
这是用于UNIX / Linux,但是我敢肯定,对于Windows也存在pg_dump。
sp_help
是它返回多个结果集。您正在描述第一个结果集返回的列。