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

Posted

技术标签:

【中文标题】有没有办法使用普通 ADO 从 SQL Server 检索视图定义?【英文标题】:Is there a way to retrieve the view definition from a SQL Server using plain ADO? 【发布时间】:2011-06-13 12:19:15 【问题描述】:

我使用 ADO Connection OpenSchema() 调用在其各种化身中成功地从托管在 SQL 服务器上的数据库中提取列定义,因此我可以以编程方式在另一个 SQL 数据库中重新创建这些表。到目前为止,一切顺利。

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

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

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

【问题讨论】:

【参考方案1】:

哪个版本的 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 N 以获取带有N 字符的结果。

【讨论】:

答案中的SQL查询可以简化一点:select m.definition from sys.sql_modules m where m.object_id = object_id('dbo.MyView', 'V') 另一个警告是您可能需要正确的权限才能查看定义。我为他们得到了 NULL。 @schlamar,如果您看到的只是前 255 个字符,那么您正在错误地转换结果列。 sys.sql_modules 的架构这样定义列:definition nvarchar(max) SQL text that defines this module. NULL = Encrypted. @schlamar,您可能还注意到,如果您使用的是 SSMS/查询分析器,如果您以 text(而不是网格)的形式运行查询结果,默认情况下,[n][var]char 数据被截断为 256 个字符。您可以通过Query..Query Options... 的菜单更改它—在随后的模态对话框中,向下钻取到左侧树控件中的 Results>Text 节点。 我使用 MS-SQL 命令行工具 (sqlcmd.exe)。它也会截​​断数据。我必须通过参数 -y N 来获取更多数据(真的是 MS?)。所以感谢您为我指明正确的方向。【参考方案2】:

Microsoft 列出了以下获取视图定义的方法: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';

【讨论】:

【参考方案3】:

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

【讨论】:

此版本返回的视图被分成多条记录,每条记录有 4,000 个字符。 (在 SQL Server 2014 中测试。)【参考方案4】:
SELECT object_definition (OBJECT_ID(N'dbo.vEmployee'))

【讨论】:

【参考方案5】:

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

对于表:sp_help table_name 对于视图:sp_help view_name

【讨论】:

虽然没有给出视图定义。【参考方案6】:
SELECT definition, uses_ansi_nulls, uses_quoted_identifier, is_schema_bound  
FROM sys.sql_modules  
WHERE object_id = OBJECT_ID('your View Name');  

【讨论】:

【参考方案7】:

本例:Views Collection, CommandText Property Example (VB) 展示如何使用 ADOX 通过更改与 VIEW 相关的 COMMAND 来维护 VIEWS。 而是像这样使用它:

 Set cmd = cat.Views("AllCustomers").Command  

' Update the CommandText of the command.  
cmd.CommandText = _  
"Select CustomerId, CompanyName, ContactName From Customers"  

尝试使用这种方式:

Set CommandText = cat.Views("AllCustomers").Command.CommandText

【讨论】:

以上是关于有没有办法使用普通 ADO 从 SQL Server 检索视图定义?的主要内容,如果未能解决你的问题,请参考以下文章

利用ADO让普通人用excel读取oracle数据库表的通用办法

根据 ADO 提供程序格式化日期

ADO.NET 中参数化 SQL 命令的最终形式

使用 ADO 和 SQL 加速从表中查询

使用 ADO.NET 将数据表从内存推送到 SQL Server

有没有一种方便的方法可以使用 ADO .NET 将数据从单个列获取到集合中?