有没有办法使用普通 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数据库表的通用办法