patternsqlModerate
Switching between databases with dynamic SQL
Viewed 0 times
databaseswithsqlswitchingbetweendynamic
Problem
I have a process which involves executing various commands between multiple databases - however, when I use dynamic SQL to change DB with 'use @var', then it doesn't actually change the database.
Executing this in [test_db]:
Returns [Master] as the current database name - if I put
Is there a way to do this which will correctly switch between databases?
Executing this in [test_db]:
declare @currentDB varchar(max)
declare @sql varchar(max)
set @currentDB = DB_NAME()
set @sql = 'use [' + @currentDB +']'
use master
exec(@sql)
select DB_NAME()Returns [Master] as the current database name - if I put
use [test_db] as a command, rather than dynamically, then it returns the correct name.Is there a way to do this which will correctly switch between databases?
Solution
Sure, there is a way - there's always a way...
If you declare variable and store in it the database and the procedure to run, you can exec it, with parameters.
Example
It is trivial to then pass a query with parameters to be run in any database
I know this doesn't change database context in the main query, but wanted to demonstrate how you can conveniently work in another database in a safe parameterised way without too much bother.
If you declare variable and store in it the database and the procedure to run, you can exec it, with parameters.
Example
use tempdb;
select db_name();
declare @db sysname = 'master.sys.sp_executesql';
exec @db N'select db_name()';
set @db = 'msdb.sys.sp_executesql';
exec @db N'select db_name()';It is trivial to then pass a query with parameters to be run in any database
declare @proc sysname, @sql nvarchar(max), @params nvarchar(max);
select
@proc = 'ssc.sys.sp_executesql'
, @sql = N'select top 10 name from sys.tables where name like @table order by name;'
, @params = N'@table sysname';
exec @proc @sql, @params, @table = 'Tally%'I know this doesn't change database context in the main query, but wanted to demonstrate how you can conveniently work in another database in a safe parameterised way without too much bother.
Code Snippets
use tempdb;
select db_name();
declare @db sysname = 'master.sys.sp_executesql';
exec @db N'select db_name()';
set @db = 'msdb.sys.sp_executesql';
exec @db N'select db_name()';declare @proc sysname, @sql nvarchar(max), @params nvarchar(max);
select
@proc = 'ssc.sys.sp_executesql'
, @sql = N'select top 10 name from sys.tables where name like @table order by name;'
, @params = N'@table sysname';
exec @proc @sql, @params, @table = 'Tally%'Context
StackExchange Database Administrators Q#118729, answer score: 16
Revisions (0)
No revisions yet.