caso de que alguien que necesita una solución para esto, este es uno:
si se utiliza una sentencia USE dinámica toda la consulta tiene que ser dinámico, ya que tiene que ser todo en el mismo contexto.
Puede probar con SYNONYM, es básicamente un ALIAS a una tabla específica, este SYNONYM se inserta en el sistema.mesa de sinónimos para que tenga acceso a la misma desde cualquier contexto
Mira esta declaración estática:
CREATE SYNONYM MASTER_SCHEMACOLUMNS FOR Master.INFORMATION_SCHEMA.COLUMNS
SELECT * FROM MASTER_SCHEMACOLUMNS
Ahora dinámica:
DECLARE @SQL VARCHAR(200)
DECLARE @CATALOG VARCHAR(200) = 'Master'
IF EXISTS(SELECT * FROM sys.synonyms s WHERE s.name = 'CURRENT_SCHEMACOLUMNS')
BEGIN
DROP SYNONYM CURRENT_SCHEMACOLUMNS
END
SELECT @SQL = 'CREATE SYNONYM CURRENT_SCHEMACOLUMNS FOR '+ @CATALOG +'.INFORMATION_SCHEMA.COLUMNS';
EXEC sp_sqlexec @SQL
--Your not dynamic Code
SELECT * FROM CURRENT_SCHEMACOLUMNS
Ahora acaba de cambiar el valor de @CATALOG y podrá para hacer una lista de la misma tabla pero de un catálogo diferente.
Siguiendo Preet, tendrá que colocar todas las consultas para USE/SELECT en una sola llamada sp_sqlexec. El USE no sobrevivirá más allá de la llamada. –
Conozco esta solución, pero es fea e ilegible. Tener un script que genere el SQL final también sería una opción. – Drejc
Lo siento, pensé que solo estabas buscando una solución dentro del SQL. Dentro de SQL, solo tiene el enfoque sp_sqlexec; la otra opción es construir la secuencia SQL de USE/SELECT externamente. Aún necesitará construir el SQL a mano pero, en el lado positivo, su entorno de script/aplicación elegido será más fácil en la manipulación de cadenas y no se verá tan feo. –