Stored procedures are made to destroy boundaries, but at least we have table functions now which at least give some modicum to respecting the data i.e. there are inputs and there are outputs instead of ref or out parameters.

Use a table function with a cross apply instead of a join because of table functions

SELECT ts.* FROM [dbo].[theTable] t\nCROSS APPLY dbo.zzz(t.MI_PRINX) ts

Table function

CREATE FUNCTION [dbo].[zzz](@targetId int)
RETURNS @targetData TABLE 
(
 -- Columns returned by the function
 TargetArea int NOT NULL, 
     TableName varchar(255) NOT NULL,
     Id int NOT NULL,
     [Name] varchar(255) NULL
)
AS
BEGIN
     DECLARE @TempTable table (TableName varchar(255) NOT NULL, Id int NOT NULL, [Name] varchar(255) NULL)

     INSERT INTO @TempTable
     select top 1 'Site', s.site_id, s.[name]
     from [dbo].[theTable] as t
     inner join [dbo].[otherTable] as s
     on s.SP_GEOMETRY.STIntersects(t.SP_GEOMETRY) = 1
     where t.MI_PRINX = @targetId     

     INSERT INTO @targetData (TargetArea, TableName, Id, [Name])
     SELECT @targetId, TableName, Id, [Name]
     FROM @TempTable
RETURN
END
GO