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

Tim*_*sch 80 sql-server ado view

我使用ADO Connection OpenSchema()调用以各种方式成功从SQL服务器上托管的数据库中提取列定义,因此我可以在另一个SQL数据库中以编程方式重新创建这些表.到现在为止还挺好.

使用多个视图进行与上表的主要交互; 虽然OpenSchema()能够以与返回表的列定义相同的方式返回视图的列定义,但缺少一小部分信息 - 视图中的列映射到的基础表中的哪个表和列.

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

有没有办法通过ADO获取视图配置的这些信息,或者以"ColumnX映射到表Z中的ColumnY"的方式或以用于创建视图的实际SQL命令的形式?

Nic*_*rey 146

哪个版本的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'
Run Code Online (Sandbox Code Playgroud)

这将返回包含用于创建/更改视图的脚本的单个行.

表中的其他列说明了编译视图时的选项.

注意事项

  • 如果上次使用ALTER VIEW修改了视图,则脚本将是ALTER VIEW语句而不是CREATE VIEW语句.

  • 该脚本反映了创建时的名称.它更新的唯一时间是执行ALTER VIEW,或者使用CREATE VIEW删除并重新创建视图.如果视图已重命名(例如,通过sp_rename)或所有权已转移到其他模式,则您获取的脚本将反映原始的CREATE/ALTER VIEW语句:它不会反映对象的当前名称.

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

  • 另一个警告是,您可能需要正确的权限才能查看定义.我为他们得到了NULL. (7认同)
  • 答案中的SQL查询可以简化一点:`从sys.sql_modules m中选择m.definition,其中m.object_id = object_id('dbo.MyView','V')` (6认同)

Dav*_*ger 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
Run Code Online (Sandbox Code Playgroud)
USE AdventureWorks2012; 
GO
SELECT OBJECT_DEFINITION (OBJECT_ID('HumanResources.vEmployee')) 
AS ObjectDefinition; 
GO
Run Code Online (Sandbox Code Playgroud)
EXEC sp_helptext 'HumanResources.vEmployee';
Run Code Online (Sandbox Code Playgroud)


Tra*_*Guy 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'
Run Code Online (Sandbox Code Playgroud)


小智 5

SELECT object_definition (OBJECT_ID(N'dbo.vEmployee'))
Run Code Online (Sandbox Code Playgroud)