Current hardware doesn’t support indexing into an array of textures at runtime. (Actually, this is possible from DirectX 10 using texture arrays, but not for 3D textures).
The only solutions would be to do multiple tex3D fetches and select the correct result (which is wasteful), or pack all the volumes into a single 3D texture (which is subject to the maximum texture size).
If you just want to select the volume from the host, you can bind the texture to different 3D arrays in global memory.
The 3D tecture size should be enough to store the data.
But the coming problem will be the waste of memory and time.
If the size of data are not the same, it will waste some memory for pack all the data. And it will take some time(I am not sure if it will be too long?) for combin the data into a 3D texture.