2

내 기능은 다음과 같습니다 : 함수가 아니었다에 나는 테이블 변수에 대한 작업을 생각T-SQL 함수에서 테이블 변수에 대해 INSERT EXEC를 실행할 수없는 이유는 무엇입니까?

Invalid use of a side-effecting operator 'INSERT EXEC' within a 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을 실행하면, 나는 다음과 같은 오류가 발생합니다 수술을 고려한 부작용?

+2

함수 내부에서 저장 프로 시저를 실행할 수 있는지 확신하지 못합니다. 내가 맞다면 그것은 삽입물이 아니며'exec' 그 자체입니다. –

+0

@ ZoharPeled 네, 슬프게도 당신이 옳을 수도 있습니다. – ProfK

+0

글쎄, 내가 옳다는 것이 밝혀졌다. [SO 게시물이 제안한대로] (http://stackoverflow.com/questions/6344880/execute-stored-procedure-from-a-function) –

답변

5

INSERT ... EXEC은 장면 뒤에서 임시 테이블을 만들기 때문에 부작용입니다.

이 그것에 대해 더 많은 것을 위해 The Hidden Costs of INSERT EXEC를 참조 the execution plan for this dbfiddle

에 표시된 매개 변수 테이블 스캔 뒤에.

이렇게하려면 CLR 기능을 만드는 것이 가장 좋습니다.