snippetsqlMajor
How to Dynamically change the database using TSQL
Viewed 0 times
tsqlthedynamicallydatabaseusinghowchange
Problem
I'm having trouble with trying to dynamically change the context of SSMS to the database specified in dynamic SQL:
It executes successfully however the database context of SSMS doesn't change.
I've tried a slight modification to the above like so
Again, it executes successfully, but the database doesn't change.
EXEC sys.sp_executesql N'USE db1 ' ;It executes successfully however the database context of SSMS doesn't change.
I've tried a slight modification to the above like so
DECLARE @sql NVARCHAR(100) DECLARE @db NVARCHAR(50)
SET @db = N'db1' SET @sql = N'Use ' + @db
EXEC sp_executesql @sqlAgain, it executes successfully, but the database doesn't change.
Solution
SSMS WILL NOT, I REPEAT, WILL NOT SWITCH TO THE CONTEXT OF A USE COMMAND YOU RUN IN DYNAMIC SQL.
If the ultimate goal is to execute some other dynamic SQL inside the chosen database, this is easy enough:
If you need to pass parameters, no problem:
If the goal is to execute some static SQL inside the chosen database, maybe you should consider storing that static SQL in a stored procedure in each database, and calling it dynamically like this:
And hopefully the ultimate goal is not to run all this code in SSMS just so that SSMS is now in the context of
If the ultimate goal is to execute some other dynamic SQL inside the chosen database, this is easy enough:
DECLARE @db sysname = N'db1';
DECLARE @exec nvarchar(max) = QUOTENAME(@db) + N'.sys.sp_executesql',
@sql nvarchar(max) = N'SELECT DB_NAME();';
EXEC @exec @sql;If you need to pass parameters, no problem:
DECLARE @db sysname = N'db1', @i int = 1;
DECLARE @exec nvarchar(max) = QUOTENAME(@db) + N'.sys.sp_executesql',
@sql nvarchar(max) = N'SELECT DB_NAME(), @i;';
EXEC @exec @sql, N'@i int', @i;If the goal is to execute some static SQL inside the chosen database, maybe you should consider storing that static SQL in a stored procedure in each database, and calling it dynamically like this:
DECLARE @db sysname = N'db1';
DECLARE @exec nvarchar(max) = QUOTENAME(@db) + N'.sys.sp_executesql',
@sql nvarchar(max) = N'EXEC dbo.procedurename;';
EXEC @exec @sql;And hopefully the ultimate goal is not to run all this code in SSMS just so that SSMS is now in the context of
@db... Daniel would really like it if I state explicitly that this is not possible, as @Lothar's comment also stated.Code Snippets
DECLARE @db sysname = N'db1';
DECLARE @exec nvarchar(max) = QUOTENAME(@db) + N'.sys.sp_executesql',
@sql nvarchar(max) = N'SELECT DB_NAME();';
EXEC @exec @sql;DECLARE @db sysname = N'db1', @i int = 1;
DECLARE @exec nvarchar(max) = QUOTENAME(@db) + N'.sys.sp_executesql',
@sql nvarchar(max) = N'SELECT DB_NAME(), @i;';
EXEC @exec @sql, N'@i int', @i;DECLARE @db sysname = N'db1';
DECLARE @exec nvarchar(max) = QUOTENAME(@db) + N'.sys.sp_executesql',
@sql nvarchar(max) = N'EXEC dbo.procedurename;';
EXEC @exec @sql;Context
StackExchange Database Administrators Q#185018, answer score: 20
Revisions (0)
No revisions yet.