このように動的に実行する場合は、動的SQLを使用する必要があります。そのDBのコンテキストで実行したいものは何でも意味しますが、動的SQLステートメントにも含める必要があります。
つまり、MainDB内のすべてのテーブルを一覧表示するとします。
USEステートメントは別のコンテキストにあるため、これは機能しません。EXECUTEが実行されると、次のSELECTは同じコンテキストで実行されないため、MainDbでは実行されません(接続がすでにに設定されている場合を除く)。 MainDb)
DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName) -- SQL injection risk!
SELECT name FROM sys.tables
したがって、次のことを行う必要があります:
DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName + ';SELECT name FROM sys.tables') -- SQL injection risk!
もちろん、SQLインジェクションには細心の注意を払う必要があります。そのために、バリーの回答のリンクを示します。
SQLインジェクションを防ぐために、QUOTENAME()関数を使用することもできます。これは、パラメーターを角かっこで囲みます。
DECLARE @DatabaseName sysname = 'MainDb'
, @SQL NVARCHAR(MAX);
SET @SQL = N'USE ' + QUOTENAME(@DatabaseName);
PRINT(@SQL);
-- USE [MainDb]
EXECUTE(@SQL);