As many as possible. There's no exact number.
I get the feeling you don't even know what temporal variables are...
Most of the time, people create unique variables for each of their spells which they don't use anywhere else. For example a "HolyNovaCaster" variable would probably be used only for a "Holy Nova" spell, a "SliceAndDiceTarget" would be used exclusively for "Slice and Dice" spell, etc.
But actually most of these variables can be replaced with one "pack" of variables that are used for general purpose. Those are temporal variables.
Look at the code below. Let's say you have Holy Nova spell:
-
Holy Nova
-
Events
-

Unit - A unit starts the effect of an ability
-
Conditions
-

Ability being cast equals to Holy Nova
-
Actions
-

Set HolyNovaCaster = (Triggering Unit)
-

Set HolyNovaPoint = (Positions of HolyNovaCaster)
-

Set HolyNovaGroup = Units within 400.00 range of HolyNovaPoint...
-

Unit Group - Pick every unit in HolyNovaGroup and do (Actions):
-


Unit - Set life of (Picked unit) to (Life of (Picked unit) + 50.00)
-

Set life of HolyNovaCaster to (Life of HolyNovaCaster + 100.00)
-

Custom script: call DestroyGroup(udg_HolyNovaGroup)
-

Custom script: call RemoveLocation(udg_HolyNovaPoint)
-

Set HolyNovaCaster = No unit
see all these HolyNova___ variables? Well, in this case you could replace them all for temporal variables. So what you would get is this:
-
Holy Nova
-
Events
-

Unit - A unit starts the effect of an ability
-
Conditions
-

Ability being cast equals to Holy Nova
-
Actions
-

Set u1 = (Triggering Unit)
-

Set loc1 = (Positions of u1)
-

Set group = Units within 400.00 range of loc1...
-

Unit Group - Pick every unit in group and do (Actions):
-


Unit - Set life of (Picked unit) to (Life of (Picked unit) + 50.00)
-

Set life of u1 to (Life of u1 + 100.00)
-

Custom script: call DestroyGroup(udg_group)
-

Custom script: call RemoveLocation(udg_loc1)
-

Set u1 = No unit
See? The trigger is exactly the same, the difference is that I used different variables.
However I would be using these exact same variables for every other spells that I could.
There is one rule to using temporal variables:
Temporal variables never hold the information saved into them for any period of time. They simply have stuff saved into them in a trigger, then immediately they are used and also immediately destroyed. As you can see in the trigger above, there is no kind of wait between any of those actions.
The reason for that is simple: During any kind of delay (be it as small as 0.01 second) it is still possible for other trigger to fire and re-write the information that has been saved into the temporal variable.
Let's say our Holy Nova spell shall pick all allies nearby the caster when the Holy Nova spell has been cast and then periodically heal those picked units.
-
Holy Nova Cast
-
Events
-

Unit - A unit starts the effect of an ability
-
Conditions
-

Ability being cast equals to Holy Nova
-
Actions
-

Set u1 = (Triggering Unit)
-

Set loc1 = (Positions of u1)
-

Set HolyNovaGroup = Units within 400.00 range of loc1...
-

Set life of u1 to (Life of u1 + 100.00)
-

Custom script: call RemoveLocation(udg_loc1)
-

Set u1 = No unit
-
Holy Nova HoT
-
Events
-

Time - Every 1.00 second of game time
-
Conditions
-
Actions
-

Unit Group - Pick every unit in HolyNovaGroup and do (Actions):
-


Unit - Set life of (Picked unit) to (Life of (Picked unit) + 50.00)
As you can see, I use a unique HolyNovaGroup, because it saves the information for some period of time, hence I couldn't use temporal variable. However you can also see that anywhere else I used temporal variables!
That's why I wrote there is no exact number.
---
So with temporal variables, you will pretty much get rid of useless variables.