Как выполнить хранимую процедуру в нескольких базах данных SQL Server: методы и примеры

В SQL Server могут возникнуть ситуации, когда вам потребуется выполнить хранимую процедуру в нескольких базах данных. В этой статье блога будут рассмотрены несколько методов выполнения этой задачи, а также приведены примеры кода. Используя эти методы, вы можете эффективно запускать хранимую процедуру во всех базах данных в среде SQL Server.

Методы выполнения хранимой процедуры во всех базах данных:

Метод 1: использование курсора

DECLARE @DatabaseName VARCHAR(100)
DECLARE @Sql NVARCHAR(MAX)
DECLARE db_cursor CURSOR FOR
SELECT name FROM sys.databases WHERE state = 0
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @DatabaseName
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @Sql = 'USE ' + QUOTENAME(@DatabaseName) + '; EXEC YourStoredProcedureName;'
    EXEC sp_executesql @Sql
    FETCH NEXT FROM db_cursor INTO @DatabaseName
END
CLOSE db_cursor
DEALLOCATE db_cursor

Метод 2: использование динамического SQL

DECLARE @Sql NVARCHAR(MAX) = ''
SELECT @Sql = @Sql + 'USE ' + QUOTENAME(name) + '; EXEC YourStoredProcedureName;'
FROM sys.databases WHERE state = 0
EXEC sp_executesql @Sql

Метод 3: использование системной хранимой процедуры

EXEC sp_MSforeachdb 'USE [?]; IF DB_ID() > 4 EXEC YourStoredProcedureName;'

Метод 4. Использование сценария PowerShell

$serverName = 'YourServerName'
$databaseNameQuery = 'SELECT name FROM sys.databases WHERE state = 0'
$storedProcedureName = 'YourStoredProcedureName'
$databases = Invoke-Sqlcmd -ServerInstance $serverName -Database 'master' -Query $databaseNameQuery
foreach ($database in $databases) {
    $currentDbName = $database.name
    $invokeQuery = "USE [$currentDbName]; EXEC $storedProcedureName;"
    Invoke-Sqlcmd -ServerInstance $serverName -Database $currentDbName -Query $invokeQuery
}