SQL Server **禁止**在存儲過程/觸發器中直接使用 USE dbname 切換數據庫上下文,編譯報錯。
CREATE PROC test_cross_db
AS
BEGIN
-- 在動態批次中切換上下文並執行操作
EXEC('USE pubs; EXEC sp_adduser ''test_user'';');
END
GO
-- 執行
EXEC test_cross_db;
EXEC('...') 創建**獨立批次**,擁有自己的數據庫上下文CREATE PROC ExecInDb
@TargetDb SYSNAME,
@Sql NVARCHAR(MAX)
AS
BEGIN
DECLARE @Wrapper NVARCHAR(MAX) =
N'USE ' + QUOTENAME(@TargetDb) + N'; ' + @Sql;
EXEC(@Wrapper);
END
-- 調用:在 msdb 中創建 Job
EXEC ExecInDb 'msdb', N'EXEC sp_add_job @job_name = N''MyJob'';';
CREATE DATABASE ... CONTAINMENT = PARTIAL,用戶無需實例級登錄即可跨庫訪問CREATE SYNONYM dbo.t FOR OtherDb.dbo.t; 透明訪問@Sql 若包含用戶輸入,必須用 sp_executesql + 參數化。BEGIN DISTRIBUTED TRAN。