相关疑难解决方法(0)

调用表值函数时使用 NOLOCK 提示

假设有以下函数:

CREATE FUNCTION [dbo].[ufnTest]()
RETURNS TABLE
AS RETURN SELECT 1 AS Nr
Run Code Online (Sandbox Code Playgroud)

我的实际函数将从许多不同的表中选择实际数据。我(大部分)理解使用 nolock 提示的风险,并决定在这种情况下我真的想要它们。所以我尝试像这样调用上面的函数:

SELECT * FROM [dbo].[ufnTest]() WITH(NOLOCK)
Run Code Online (Sandbox Code Playgroud)

但是,这失败并显示以下消息:

关键字“with”附近的语法不正确。如果此语句是公共表表达式、xmlnamespaces 子句或更改跟踪上下文子句,则前一条语句必须以分号终止。

修复此错误的提示不相关。也许这个表提示不适用于表值函数?

我会考虑几种选择。一种是在我的选择查询中的所有表上使用提示,但我不想这样做,因为 (a) 每当我更改函数时我都必须记住这一点,并且 (b) 它是重复的。另一种选择是SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED,但缺点是我不太知道如何将它设置回之前的状态(并且从我的 TVF 选择之后的语句应该具有原始隔离级别)。

因此,我更愿意WITH (NOLOCK)从表值函数中进行选择。这可能吗?

sql-server sql-server-2012 functions nolock

8
推荐指数
1
解决办法
1万
查看次数

标签 统计

functions ×1

nolock ×1

sql-server ×1

sql-server-2012 ×1