SQL Server スキーマ(Schema)指定無しの時のオブジェクトの検索順

調べる機会があったので。

On Default Schemas and "Search Paths" - SQL Server Science
sql server - SQL default schema resolution in Stored Procedure - Stack Overflow
Dude, where's my table? - Bob Beauchemin

幾つか記事はありますが、足りなかったり、古かったりしたので 2019 の環境で検証かねて試しました。

試した感じ概ね Dude, where's my table? - Bob Beauchemin に書いてある順番通りでした。

  • クエリ
    1. ユーザーのデフォルトスキーマ
    2. dbo
  • ファンクション、ストアド
    1. ファンクション、ストアドのスキーマ
    2. dbo ※sys スキーマについては未検証。

ただ 最初に sys を探すってのが謎。 2005 の時はそうだったんかな?

use [master]
go
create database [hoge]
go

use [hoge]
go
select * from sys.tables
select * from tables -- これで sys.tables を見つけてくれない
go

何か読み間違えてる?

検証クエリは gist に貼ってます。
ログイン作るの面倒なので包含データベース使ってます。
包含データベースへの包含ユーザー アクセス - SQL Server | Microsoft Docs
包含データベース許可してない場合は↓しといてください。

sp_configure 'contained database authentication', 1;  
GO  
RECONFIGURE;  
GO  

T-SQL スキーマ(Schema)無しでの呼出しでどのスキーマのものが使われるのか