Důvodem je rozsah EXEC prohlášení se liší od rozsahu obsahujícího sproc. To znamená vaše volání EXEC vytváří dočasnou tabulku a poté je automaticky zrušena jako rozsah pro EXEC je ponecháno. V podstatě musíte udělat všechno uvnitř jednoho EXEC prohlášení:
DECLARE @sql VARCHAR(MAX)
SET @sql = 'SELECT * INTO #temp
FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1
INSERT INTO #temp ...'
EXEC(@sql)