В 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
}