У меня проблемы с попыткой динамически изменить контекст SSMS на базу данных, указанную в динамическом SQL:
EXEC sys.sp_executesql N'USE db1 ' ;
Он выполняется успешно, однако контекст базы данных SSMS не изменяется.
Я попытался небольшое изменение выше, как
DECLARE @sql NVARCHAR(100) DECLARE @db NVARCHAR(50)
SET @db = N'db1' SET @sql = N'Use ' + @db
EXEC sp_executesql @sql
Опять же, он выполняется успешно, но база данных не меняется.
Ответы:
SSMS НЕ БУДЕТ, ПОВТОРЯЮ, НЕ ПОЛУЧИТСЯ В КОНТЕКСТЕ КОМАНДЫ ИСПОЛЬЗОВАНИЯ, КОТОРЫЙ ВЫ БУДЕТЕ ДИНАМИЧНЫМ SQL
Если конечной целью является выполнение некоторого другого динамического SQL внутри выбранной базы данных, это достаточно просто:
Если вам нужно передать параметры, нет проблем:
Если цель состоит в том, чтобы выполнить некоторый статический SQL внутри выбранной базы данных, возможно, вам следует рассмотреть возможность сохранения этого статического SQL в хранимой процедуре в каждой базе данных и динамического его вызова следующим образом:
И, надеюсь, конечная цель не состоит в том, чтобы запускать весь этот код в SSMS просто для того, чтобы SSMS теперь находился в контексте
@db
... Дэниелу очень понравилось бы, если бы я прямо заявил, что это невозможно, как отмечается в комментарии @ Lothar.источник
На самом деле dynamicSQL не выполняется конкретно в строке с остальной частью вашего кода, это отдельная сущность (даже если он запускается, как если бы он был в строке
Если вы запустите код:
SET @sql = N'Use ' + @db + '; select DB_NAME(); select @@spid'
на месте вашего текущего набора вы заметите, что возвращающиеся результаты указывают, что вы переместили активную базу данных, но все еще работаете в том же соединении.Если вы хотите изменить выбор базы данных, лучше всего сделать что-то вроде этого:
Он не очень приятный или чистый и требует двух строк для каждой потенциальной базы данных, но он выполнит свою работу (не запускайте его в динамическом SQL, иначе у вас все равно останется та же проблема, что и основной поток не изменился)
Обратите внимание, что использование команд USE запрещено в процедурах / функциях
источник