是否可以使用普通ADO从SQL Server中检索视图定义?

问题描述 投票:84回答:6

我正在使用ADO Connection OpenSchema()调用的各种形式成功地从SQL Server托管的数据库中提取列定义,因此我可以以编程方式在另一个SQL数据库中重新创建这些表。到目前为止,一切都很好。

与上述表格的主要交互是通过多个视图进行的;尽管OpenSchema()能够以返回表的列定义的相同方式返回视图的列定义,但是缺少关键的信息-视图中的列映射到基础表中的哪个表和列。

我尝试使用ADOX目录视图访问用于创建视图的SQL命令,但似乎我们正在使用的SQL Server的OLEDB驱动程序不支持此功能。

是否有任何方法可以通过ADO获得视图配置的此信息,要么以声明“ ColumnX映射到表Z中的ColumnY”的方式,要么以用于创建视图的实际SQL命令的形式?

sql-server view ado
6个回答
148
投票

哪个版本的SQL Server?

对于SQL Server 2005和更高版本,您可以像这样获得用于创建视图的SQL脚本:

select definition
from sys.objects     o
join sys.sql_modules m on m.object_id = o.object_id
where o.object_id = object_id( 'dbo.MyView')
  and o.type      = 'V'

这将返回一行,其中包含用于创建/更改视图的脚本。

表中的其他列介绍在编译视图时已使用的选项。

注意事项

  • 如果视图最后一次使用ALTER VIEW进行了修改,则脚本将是ALTER VIEW语句,而不是CREATE VIEW语句。

  • 该脚本反映了创建时的名称。它只有在执行ALTER VIEW或使用CREATE VIEW拖放并重新创建视图后才更新。如果视图已重命名(例如,通过sp_rename)或所有权已转移到其他模式,则返回的脚本将反映原始的CREATE / ALTER VIEW语句:它将不反映对象的当前名称。

  • 某些工具截断输出。例如,MS-SQL命令行工具sqlcmd.exe会将数据截断为255个字符。您可以传递参数-y NN个字符获取结果。


21
投票

Microsoft列出了以下用于获取View定义的方法:http://technet.microsoft.com/en-us/library/ms175067.aspx


USE AdventureWorks2012;
GO
SELECT definition, uses_ansi_nulls, uses_quoted_identifier, is_schema_bound
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('HumanResources.vEmployee'); 
GO

USE AdventureWorks2012; 
GO
SELECT OBJECT_DEFINITION (OBJECT_ID('HumanResources.vEmployee')) 
AS ObjectDefinition; 
GO

EXEC sp_helptext 'HumanResources.vEmployee';

12
投票

对于SQL 2000的用户,将提供此信息的实际命令是:

select c.text
from sysobjects     o
join syscomments    c on c.id = o.id
where o.name = '<view_name_here>'
  and o.type      = 'V'

5
投票
SELECT object_definition (OBJECT_ID(N'dbo.vEmployee'))

3
投票

您可以通过以下查询获取表/视图的详细信息。

对于表:sp_help table_name对于视图:sp_help视图名称


0
投票
SELECT definition, uses_ansi_nulls, uses_quoted_identifier, is_schema_bound  
FROM sys.sql_modules  
WHERE object_id = OBJECT_ID('your View Name');  
© www.soinside.com 2019 - 2024. All rights reserved.