-- create a table to run the function againstCREATE TABLE test2 (id INT, col1 CHAR(1))GO-- create the TVFCREATE FUNCTION test (@id INT)RETURNS @table TABLE (id INT, col1 CHAR(1))AS BEGIN INSERT INTO @table SELECT * FROM test2 AS T WHERE id = @id ; RETURN ENDGO-- table variable for outer/left inputDECLARE @test1 TABLE (id INT, col1 CHAR(1))-- insert test dataINSERT INTO @test1 (id, col1) SELECT TOP 10 ROW_NUMBER() OVER (ORDER BY OBJECT_ID), CHAR(ROW_NUMBER() OVER (ORDER BY OBJECT_ID) + 60) FROM sys.all_columns AS AC INSERT INTO test2 (id, col1) SELECT TOP 10 ROW_NUMBER() OVER (ORDER BY OBJECT_ID), CHAR(ROW_NUMBER() OVER (ORDER BY OBJECT_ID) + 60) FROM sys.all_columns AS AC -- cross join Cartesian product SELECT *FROM @test1 CROSS JOIN test2 -- outer apply on a derived table SELECT *FROM @test1 AS one CROSS APPLY ( SELECT * FROM test2 AS two WHERE one.id = two.id ) AS test2 -- outer apply TVFSELECT *FROM @test1 AS one CROSS APPLY dbo.test(one.id) ; DROP TABLE test2 ; GODROP FUNCTION dbo.test ;