为什么我不能在 T-SQL 函数的 table 变量上 运行 INSERT EXEC?

Why can't I run INSERT EXEC on a table variable in a T-SQL function?

我的函数如下所示:

CREATE FUNCTION fn_FileSys_DirExists(@dirName AS nvarchar(260))
RETURNS bit
AS
BEGIN
    DECLARE @dirExists int
    DECLARE @fileResults TABLE
    (
        file_exists int,
        file_is_a_directory int,
        parent_directory_exists int
    )

    INSERT @fileResults (file_exists, file_is_a_directory, parent_directory_exists)
    EXEC master.dbo.xp_fileexist @dirName

    SELECT @dirExists = file_is_a_directory FROM @fileResults
    RETURN @dirExists
END

当我尝试执行上述 SQL 时,出现以下错误:

Invalid use of a side-effecting operator 'INSERT EXEC' within a function.

我认为对函数中 table 变量的操作不被视为副作用操作?

INSERT ... EXEC 是一个副作用运算符,因为它最终会在幕后创建一个临时 table。

这是the execution plan for this dbfiddle

中显示的参数table扫描的后面

有关详细信息,请参阅 The Hidden Costs of INSERT EXEC

您最好编写一个 CLR 函数来执行此操作。