用于显示表定义的 T-SQL 查询?

什么样的查询可以显示完整的定义,包括 SQLServer 表的索引和键?我想要一个纯粹的查询-并且知道 SQL Studio 可以给我这个,但我经常在“野生”计算机上,只有最基本的应用程序,我没有权利安装工作室。但 SQLCMD 总是一个选项。

更新: 我已经尝试了 sp _ help,但是只生成一条记录,显示 Name、 Owner、 Type 和 Created _ Datetime。我在 sp _ help 中还漏掉了什么吗?

这就是我所说的:

帮助机场

注意,我确实需要定义表的 DDL。

306335 次浏览

我能想到的最简单和最快捷的方法是使用 Sp _ help

sp_help 'TableName'

sp_help 'YourTableName'

你试过 sp _ help 吗?

sp_help 'TableName'

尝试 sp _ help 存储过程。

Sp _ help < >

作为巴里答案的补充。Sp _ help 本身也可以用来迭代特定数据库中的所有对象。您的工具库中还有 sp _ help text,它可以将编程元素(比如存储过程)编写成脚本。

这将返回表中定义的列、数据类型和索引:

--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 _ column过程。

EXEC sys.sp_columns @TABLE_NAME = 'YourTableName'

没有简单的方法可以返回 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);
}
}
}

只需键入表名并选择它,然后按 ATL + F1即可

假设您的表名是 Customer,然后打开一个 新的查询窗口,键入并选择表名,然后按 ALT + F1

它将显示表的完整定义。

访问 http://www.stormrage.com/SQLStuff/sp_GetDDL_Latest.txt

您将找到 SQLServer 的 sp_getddl过程代码。 该过程的目的是为任何表、临时表或对象编写脚本。

用法:

exec sp_GetDDL GMACT

或者

exec sp_GetDDL 'bob.example'

或者

exec sp_GetDDL '[schemaname].[tablename]'

或者

exec sp_GetDDL #temp

我在 SQLServer2012上对它进行了测试,它的表现非常出色。

我不是这个程序的作者,任何改进都发给 Lowell Izaguirre (script@stormrage.com)。

对于使用 LINQPad 的用户,@Anthony Faull 的回答是:

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

并添加 Anthony 代码片段中提到的名称空间引用。

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

自 SQL2012以来,您可以运行以下语句:

Exec sp_describe_first_result_set @tsql= N'Select * from <yourtable>'

如果您输入一个复杂的 select 语句(连接、子选择等) ,它将为您提供结果集的定义。如果您需要创建一个新表(或临时表) ,并且不希望手动检查每个字段定义,那么这非常方便。

Https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-describe-first-result-set-transact-sql

我知道这是个老问题,但这正是我想要的。因为我想批处理一些表,所以我为 PowerShell 重写了来自 Anthony Faull 的 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_help显示通用表定义:

Sp _ help‘ table _ name _ in _ current _ db _ context’

当使用多个上下文的表格时,可以在上面的命令前面加上所需的上下文,而不是用 use db_xyz改变它们:

DB _ Products. . sp _ help‘ MyTable’——用于在 DB _ Products 中定义 MyTable

它也适用于临时表:

Temdb.sp _ help’# TempTable’——用于在当前上下文中定义 # TempTable。

有一种简单的方法可以获得任何数据库对象的 DDL 脚本。

  1. 打开 SQLServerManagementStudio
  2. 连接到源数据库服务器。
  3. 展开数据库树。
  4. 右键单击要导出表的数据库。
  5. 在子菜单中,展开“任务”。
  6. 在子菜单中,选择“生成脚本...”
  7. 使用向导选择要导出的对象。
  8. 对于脚本选项,为每个对象选择1个脚本。

这将为您选择的每个表、视图、存储过程、用户、角色或架构导出一个文件。把这个带到目的地的电脑上。