2009-04-29 101 views
7

我正在查看SQL Server 2005中的sys.sp_dbcmptlevel的来源。“%% DatabaseEx”在TSQL中做什么?

在源代码中,有这条线我不明白它是如何工作的。

EXEC %%DatabaseEx(Name = @dbname).SetCompatibility(Level = @input_cmptlevel) 

它似乎不是DatabaseEx是一个存储过程。

-- does not return any result 
select * 
from sys.procedures 
where [name] like '%DatabaseEx%' 

所以我的问题是

  • 什么是DatabaseEx和它有什么作用?
  • 什么是%%之前DatabaseEx
+0

Google可能无法搜索诸如“%%”... arg之类的内容。也许我需要更多的谷歌练习... – Sung 2009-04-29 13:31:17

+0

我仍然无法找到任何文档... – Sung 2009-04-29 18:18:09

+3

谷歌代码搜索允许像%%这样的符号,但它似乎有一个更有限的搜索区域。这似乎完全没有在MSDN上记录。我感觉系统存储过程中使用的TSQL与其他地方的TSQL没有完全一样的解析。 – 2009-04-30 02:08:27

回答

2
-- Note: database @dbname may not exist anymore 
-- Change compatibility level 
-- If invoke gets error, exception will abort this proc. 
EXEC %%DatabaseEx(Name = @dbname).SetCompatibility(Level = @input_cmptlevel) 

它看起来像一个方式来引用变量数据库作为对象,使配置的变化

2

有趣的发现。系统SP也指%% Object,%% Relation,%% ColumnEx,%% LinkedServer,%% Owner,%% CurrentDatabase(),%% ErrorMessage,%%模块,%% DatabaseRef,%% LocalLogin ,%% Alias,%% ServerConfiguration,%% IndexOrStats,%%标量类型(等)

我的解释是%%()根据过滤条件检索某种(COM?)对象,然后是方法呼叫。

7

我认为这里最好的答案是它没有记录,也不支持,所以不要依赖它。虽然了解SQL Server如何在内部工作很有意思,但使用这些知识所做的任何事情都有可能在未来的修补程序,服务包或发行版中打破。