Jobe is correct...
You seem to be misunderstanding SVSJOIN.. it is not even an oper command!!
SVSJOIN is a server-to-server command and on most ircd's can only be send by ulines. SVSJOIN instructs the ircd to join a user to a channel, but without overriding any of that channel's safeguards.
I think you may be confusing SAJOIN and SVSJOIN here... SAJOIN is a command send by clients to an IRCd and is designed to be used by services admins to force users into joining a channel. SVSJOIN on the other hand is a server-to-server command mainly intended to be used by services for example to handle auto-join lists. (Cf.
ns_ajoin, it relies heavily on SVSJOIN.) The exact implementation of SVSJOIN may differ depending on the ircd, but in all that I've seen most join restrictions are respected.
This behaviour can be illustrated by simply trying to SVSJOIN someone to a channel where they are banned: the user will see a message saying he is unable to join channel #XXX because he is banned. So the ircd is acting exactly as if the user initiated the join.
When an oper were to issue an sajoin on the other hand, the user would be joined regardless the ban and the user will get a message he was forced to join channel #XXX.
You may note that ns_ajoin still joins users to +i and +k channels, but it does so only after checking that the user has sufficient rights to override those restrictions. If the user has enough rights, ns_ajoin will issue an INVITE or remove a matching ban (depending on user access). Because SVSJOIN behaves the same way as a client issued JOIN, issuing an INVITE before joining a +k or +i channel will override said restrictions..