я так, что кто-то нужно решение для этого, это один:
если вы используете динамический оператор USE все ваш запрос должны быть динамичными, потому что она должна быть все в том же контексте.
Вы можете попробовать с помощью SYNONYM, в основном ALIAS для конкретной таблицы, этот SYNONYM вставляется в sys.синонимы стола, так что вы имеете доступ к нему из любого контекста
Посмотрите этот статический оператор:
CREATE SYNONYM MASTER_SCHEMACOLUMNS FOR Master.INFORMATION_SCHEMA.COLUMNS
SELECT * FROM MASTER_SCHEMACOLUMNS
Теперь динамическим:
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
Теперь просто изменить значение @CATALOG и вы сможете перечислить одну и ту же таблицу, но из другого каталога.
После Информация Preet, вам нужно будет поместить все запросы для USE/SELECT в один вызов sp_sqlexec. ИСПОЛЬЗОВАНИЕ не выйдет за пределы звонка. –
Я знаю об этом решении, но он уродлив и нечитабель. Наличие сценария, генерирующего окончательный SQL, также будет вариантом. – Drejc
Извините, я думал, что вы просто искали решение в самом SQL. В SQL вы используете только метод sp_sqlexec; другой вариант - построить SQL-последовательность USE/SELECT извне. Вам все равно придется строить SQL вручную, но, с другой стороны, выбранная среда сценариев/приложений будет легче манипулировать строкой и не выглядеть такой уродливой. –