SQL Server中CLR表值函数(table-valued function)不能使用WITH(NOLOCK)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server中CLR表值函数(table-valued function)不能使用WITH(NOLOCK)相关的知识,希望对你有一定的参考价值。
在SQL Server中,普通的表值函数(table-valued function)是可以使用表提示(Hints-Table)的,那么CLR类型的表值函数(table-valued function)是否也可以使用表提示(Hints-Table)呢? 相信很多人都没有留意过这个问题。
下面我以YourSQLDba中现成的CLR表值函数来演示一下这个问题。如果自己手头有自定义CLR表值函数的,也可以构造自己的实验,查看CLR表值函数可以使用下面SQL
SELECT * FROM sys.objects WHERE type=\'FT\'
如下所示,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.
下面我创建了一个视图,如下所示:
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 52
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".
其实这个是因为视图对象使用了WITH(NOLOCK)的话,就会自动转换为给视图内部对象加上WITH(NOLOCK),那么就会出现上面的错误,如果像存储过程里面调用了这样的视图,就会出现下面这样的错误信息
Cannot process the query because it references the common language runtime (CLR) table-valued function "xxxx" with a hint through view "xxxx".
但是有点奇怪的是官方资料上并没有详细说明CLR表值函数不能使用WITH(NLOCK)等表提示,不清楚是文档不够完善,还是忽略了这些细节。个人倒是第一次遇到这种错误,特此记录一下这个问题。
参考资料:
https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-table?view=sql-server-ver15
以上是关于SQL Server中CLR表值函数(table-valued function)不能使用WITH(NOLOCK)的主要内容,如果未能解决你的问题,请参考以下文章
PCB MS SQL表值函数与CLR 表值函数 (例:字符串分割转表)