有没有一种方法可以使用普通ADO从SQL Server检索视图定义?


89

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

与上述表格的主要交互是通过多个视图进行的。尽管OpenSchema()能够以与返回表的列定义相同的方式返回视图的列定义,但是缺少了关键的信息-视图中的列映射到基础表中的哪个表和列。

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

是否有任何方法可以通过ADO获得有关视图配置的此信息,即声明“ ColumnX映射到表Z中的ColumnY”还是采用用于创建视图的实际SQL命令的形式?

Answers:


158

哪个版本的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以使用Nchar获得结果。


8
答案中的SQL查询可以简化一些:select m.definition from sys.sql_modules m where m.object_id = object_id('dbo.MyView', 'V')
Ivan

8
另一个警告是您可能需要正确的权限才能查看定义。我为他们得到NULL。
rveach 2015年

1
@schlamar,如果您看到的只是前255个字符,则表示您错误地转换了结果列。用于sys.sql_modules定义列的架构如下:definition nvarchar(max) SQL text that defines this module. NULL = Encrypted.
Nicholas Carey

1
@schlamar,您可能还会注意到,如果使用的是SSMS / Query Analyzer,并且查询结果是以文本(而不是网格)形式运行的,则默认情况下,[n][var]char数据将被截断为256个字符。您可以通过Query..Query Options...—上的菜单进行更改。在随后的模式对话框中,向下钻取到Results>Text左侧树形控件中的节点。
尼古拉斯·凯里2015年

1
我使用MS-SQL命令行工具(sqlcmd.exe)。它也会截​​断数据。我必须传递参数-y N来获取更多数据(真的是MS?)。因此,感谢您为我指明了正确的方向。
schlamar 2015年

24

Microsoft列出了以下用于获取View定义的方法:http : //technet.microsoft.com/zh-cn/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';

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'

此版本将视图拆分成多个记录,每个记录包含4,000个字符。(已在SQL Server 2014中测试。)
Ben

7
SELECT object_definition (OBJECT_ID(N'dbo.vEmployee'))

3

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

对于表:sp_help table_name对于表 :sp_help view_name


0
SELECT definition, uses_ansi_nulls, uses_quoted_identifier, is_schema_bound  
FROM sys.sql_modules  
WHERE object_id = OBJECT_ID('your View Name');  
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.