“%% Database”在SQL中做了什么?

时间:2009-04-29 13:04:46

标签: sql sql-server sql-server-2005 tsql stored-procedures

我在查看SQL Server 2005中sys.sp_dbcmptlevel的来源。

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

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

DatabaseEx似乎不是存储过程。

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

所以我的问题是

  • 什么是DatabaseEx以及它做了什么?
  • DatabaseEx之前 %% 是什么?

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分: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 :(得分:2)

有趣的发现。

System SP还引用%% Object,%% Relation,%% ColumnEx,%% LinkedServer,%% Owner,%% CurrentDatabase(),%% ErrorMessage,%% Module,%% DatabaseRef,%% LocalLogin, %%别名,%% ServerConfiguration,%% IndexOrStats,%% ScalarType(etc)

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