在SQL Server中,普通的表值函數(table-valued function)是能夠使用表提示(Hints-Table)的,那麼CLR類型的表值函數(table-valued function)是否也能夠使用表提示(Hints-Table)呢? 相信不少人都沒有留意過這個問題。sql
下面我以YourSQLDba中現成的CLR表值函數來演示一下這個問題。若是本身手頭有自定義CLR表值函數的,也能夠構造本身的實驗,查看CLR表值函數能夠使用下面SQLexpress
SELECT * FROM sys.objects WHERE type='FT'app
以下所示,CLR表值函數是不能使用WITH(NOLOCK)的。它會提示語法錯誤。函數
USE YourSQLDba;
GO
SELECT *
FROM [yUtl].[clr_GetFolderList]('C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA',
'*.mdf') WITH(NOLOCK)
Msg 319, Level 15, State 1, Line 43
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.
下面我建立了一個視圖,以下所示:this
CREATE VIEW yUtl.v_test
AS
SELECT *
FROM [yUtl].[clr_GetFolderList]('C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\',
'*.mdf')
SELECT * FROM yUtl.v_test WITH(NOLOCK);
Msg 4139, Level 16, State 1, Line 52spa
Cannot process the query because it references the common language runtime (CLR) table-valued function "yUtl.clr_GetFolderList" with a hint through view "yUtl.v_test".code
其實這個是由於視圖對象使用了WITH(NOLOCK)的話,就會自動轉換爲給視圖內部對象加上WITH(NOLOCK),那麼就會出現上面的錯誤,若是像存儲過程裏面調用了這樣的視圖,就會出現下面這樣的錯誤信息orm
Cannot process the query because it references the common language runtime (CLR) table-valued function "xxxx" with a hint through view "xxxx".server
可是有點奇怪的是官方資料上並無詳細說明CLR表值函數不能使用WITH(NLOCK)等表提示,不清楚是文檔不夠完善,仍是忽略了這些細節。我的卻是第一次遇到這種錯誤,特此記錄一下這個問題。xml
參考資料:
https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-table?view=sql-server-ver15