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

时间:2017-05-09 07:46:49

标签: sql-server tsql sql-server-2012 sql-function table-variable

我的功能如下:

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时,出现以下错误:

  

无效使用副作用操作符' INSERT EXEC'在一个   功能

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

1 个答案:

答案 0 :(得分:5)

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

这是the execution plan for this dbfiddle

中显示的参数表扫描的背后

有关详情,请参阅The Hidden Costs of INSERT EXEC

你最好写一个CLR函数来做这件事。