Luk*_*ord 6 performance sql-server powershell smo alter-database
我特别想要一种可编程方式来更改服务器上所有数据库的恢复模型,并且我知道此解决方案可以应用于所有“更改数据库”命令。虽然我知道 PowerShell 中的 SMO 可以很容易地解决这个问题:
Import-Module SQLPS
CD SQL\*ServerName*\*InstanceName*\databases
foreach ($database in (ls -force)){
$database.recoverymodel = 'Full'
$database.update
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找最有效的 T-SQL 解决方案。不惜一切代价避免使用游标已经在我的脑海中根深蒂固,但是我想不出基于集合的解决方案来执行更改语句。这是基于游标的解决方案。
DECLARE @sql varchar(MAX), @name varchar(50)
DECLARE cur CURSOR FOR
SELECT name
FROM sys.databases
where name <> 'tempdb';
OPEN cur
FETCH NEXT FROM cur
INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'ALTER DATABASE ' + @name + ' SET RECOVERY FULL;'
exec(@sql)
FETCH NEXT FROM cur INTO @name
END
CLOSE CUR
DEALLOCATE cur
Run Code Online (Sandbox Code Playgroud)
wBo*_*Bob 13
至于循环用于这种类型的事情,不要担心。循环和游标的名声不好,因为通常有更好的基于集合的方法,它们通常更快。对于管理的东西,有时循环是唯一的方法,虽然你可以使用 DOS、SSIS、Powershell 等工具并行执行任务,但在这个春天没有基于集合的方法。
话虽如此,我更喜欢使用SQLCMD模式来处理这种类型的事情。这是一种特殊模式,您可以通过主菜单 > 查询 > SQLCMD 模式在 SQL Server Management Studio (SSMS) 中打开...如下所示:
一旦打开此模式,您就可以访问各种命令,例如:connect连接到另一台服务器、:r读取文件、:out重定向输出、SQLCMD 变量和任何 DOS 命令,通过在它们前面加上两个感叹号,例如!!dir.
对于您的示例,您可以执行以下操作:
:connect .\sql2014
SET NOCOUNT ON
GO
-- Redirect output back to normal
:out d:\temp\temp.sql
GO
SELECT 'ALTER DATABASE ' + name + ' SET RECOVERY FULL;'
FROM sys.databases
WHERE recovery_model_desc != 'FULL'
AND database_id > 4
AND name Not In ( 'distribution', 'SSISDB' )
GO
PRINT 'GO'
GO
-- Redirect output back to normal
:out STDOUT
-- Optionally read/run the temp file you have scripted
--:r d:\temp\temp.sql
GO
Run Code Online (Sandbox Code Playgroud)
这允许您“编写脚本”,然后您可以查看它,根据需要进行更改,并且对已运行的内容进行审计跟踪。试试 SQLCMD 模式吧!
这是一种不需要循环结构的方法:
DECLARE @sql nvarchar(MAX) = N'';
SELECT
@sql += N'ALTER DATABASE '
+ QUOTENAME(name)
+ N' SET RECOVERY FULL;
'
FROM sys.databases
WHERE database_id > 4
AND name NOT IN ( N'distribution', N'SSISDB' );
PRINT @sql;
--EXEC(@sql);
Run Code Online (Sandbox Code Playgroud)
我同意 wBob 的回答,因为人们不必过度关注很少运行的管理脚本的性能。
不保证上面的字符串连接方法将始终为根据此 Connect 项影响多行的语句产生预期结果,因为该行为取决于计划。
除了游标之外的其他方法包括 CLR 和 XML。下面是 XML 方法的示例,它对于非平凡计划更可靠,并在ORDER BY需要时提供有保证的排序。
DECLARE @sql varchar(MAX) = N'';
SET @sql = (
SELECT N'ALTER DATABASE '
+ QUOTENAME(name)
+ N' SET RECOVERY FULL;
'
FROM sys.databases
WHERE
database_id > 4
AND name NOT IN ( N'distribution', N'SSISDB' )
FOR XML PATH(''), TYPE
).value('.', 'nvarchar(MAX)');
PRINT @sql;
--EXEC(@sql);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1085 次 |
| 最近记录: |