El problema con el primero es que lo que estás haciendo es USE 'myDB'
en lugar de USE myDB
.estás pasando una cadena; pero USE está buscando una referencia explícita.
El último ejemplo funciona para mí.
declare @sql varchar(20)
select @sql = 'USE myDb'
EXEC sp_sqlexec @Sql
-- also works
select @sql = 'USE [myDb]'
EXEC sp_sqlexec @Sql