I'm probably a bit late with this but here goes..
You have
LEFT OUTER JOIN TabKmenZbozi VKmenStavVC
That's a very long alias name for a table! Aliases are meant to make SQL queries easier to read and are usually quite short.
You have
WHERE TabVyrCS.Nazev1 =
I think you have already worked out that there is a risk of SQL Injection because your code in the comments uses parameters. However you are doing something like
CMD.Parameters.AddWithValue("@TabVyrCS.Nazev1", TextBox1.Text)
which is a little confusing - it looks like you are referring to a value on the table. See the comment from @Richard-Deeming - Keep it simple and just use
CMD.Parameters.AddWithValue("@Nazev1", TextBox1.Text)
Now look at that sub-query in your first ON clause -
(SELECT TabStavSkladu.IDKmenZbozi FROM TabStavSkladu WHERE TabStavSkladu.ID=TabVyrCS.IDStavSkladu)
That is a correlated sub-query because you are referring to an item "outside" the query itself -
TabVyrCS.IDStavSkladu
It should be more efficient (and for me, easier to read) if you
join to the sub-query instead e.g.
SELECT TabVyrCS.Mnozstvi
From TabVyrCS
INNER JOIN (SELECT IDKmenZbozi, ID FROM TabStavSkladu) SQ ON SQ.ID=TabVyrCS.IDStavSkladu
LEFT OUTER JOIN TabKmenZbozi.VKmenStavVC ON VKmenStavVC.ID=SQ.ID
LEFT OUTER JOIN TabVyrCS_EXT WITH(NOLOCK) ON TabVyrCS_EXT.ID=TabVyrCS.ID
WHERE TabVyrCS.Nazev1 = @Nazev1
Sorry - I haven't been able to test this query at all so beware minor mistakes.