有没有办法使用普通的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'))