有没有办法使用普通的ADO从SQL Server中检索视图定义?

我使用各种化身中的ADO Connection OpenSchema()调用成功从SQL Server上托pipe的数据库中提取列定义,以便可以在另一个SQL数据库中以编程方式重新创build这些表。 到现在为止还挺好。

与上述表格的主要交互使用多个视图; 虽然OpenSchema()能够以与返回表的列定义相同的方式返回视图的列定义,但缺less关键信息 – 视图中的列映射到基础表中的哪个表和列。

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

有什么办法可以通过ADO获取视图configuration信息,或者以“ColumnX映射到表Z中的ColumnY”的方式,或者以用于创build视图的实际SQL命令的forms?

哪个版本的SQL Server?

对于SQL Server 2005及更高版本,您可以获取用于创build视图的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' 

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

表格中的其他列介绍了视图编译时的选项。

注意事项

  • 如果视图是最后一次使用ALTER VIEW修改的,那么脚本将是ALTER VIEW语句而不是CREATE VIEW语句。

  • 该脚本反映了创build时的名称。 唯一一次更新是如果你执行ALTER VIEW,或者用CREATE VIEW删除并重新创build视图。 如果视图已被重命名(例如,通过sp_rename ),或者所有权已被转移到不同的模式,则返回的脚本将反映原始的CREATE / ALTER VIEW语句:它不会反映对象的当前名称。

  • 某些工具会截断输出。 例如,MS-SQL命令行工具sqlcmd.exe截断255个字符的数据。 你可以传递参数-y N来得到N字符的结果。

对于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' 

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'; 
 SELECT object_definition (OBJECT_ID(N'dbo.vEmployee'))