如何在Shrink数据库sql脚本中提供最新的数据库名称?

时间:2016-11-11 09:33:33

标签: sql-server tsql

我使用下面的脚本来缩小数据库。我知道即使不是最佳实践,但要求缩小。有没有办法在每次进入缩小的脚本时获取最新的数据库名称。目前我手动做但需要自动完成。请有人建议。

USE [Sales_backup_2016_08_10_203001_7966467]
ALTER DATABASE [Sales_backup_2016_08_10_203001_7966467]
SET RECOVERY SIMPLE
DBCC SHRINKFILE (Sales_Data)
GO
USE [Sales_backup_2016_08_10_203001_7966467]
DBCC SHRINKFILE (Sales_Log,0)
GO
ALTER DATABASE [Sales_backup_2016_08_10_203001_7966467]
SET RECOVERY SIMPLE
DBCC SHRINKFILE (Sales_Log,0)
GO

2 个答案:

答案 0 :(得分:1)

本声明可能会对您有所帮助

SELECT TOP 1 NAME FROM SYS.DATABASES WHERE name<>'tempdb' ORDER BY create_date DESC

答案 1 :(得分:1)

以下是您可以使用的几种方法:

方法A:Dynamic SQL

这个查询有点陈​​旧且可以改进,它将shrink语句写入变量。然后执行该变量。

为简洁起见,我没有包括完整的缩减声明。编辑以+ 'USE ' + QUOTENAME(d.name)...开头的行。

此查询最好在结果到文本模式(Ctrl + T)中查看,因为它使用换行符使内容更易于阅读(对于我们人类而言)。

    DECLARE @Qry NVARCHAR(MAX)  = ''        -- The dynamic SQL is written to this var.

    -- Populate @Qry.
    SELECT  
        @Qry = @Qry 
            + 'USE ' + QUOTENAME(d.name) + '; ALTER DATABASE ' + QUOTENAME(d.name) + ' ...;'
            + CHAR(10) 
    FROM    
        sys.Databases d
    WHERE   
        d.[State] =0 
        AND LOWER(d.Name) <> 'tempdb'
    ;

/* Enable the first line to run.
 * Disable the bottom line, when you are happy with the script.
 */
-- EXECUTE sp_ExecuteSQL @Qry
SELECT @Qry;

方法B:Maintencance Tasks

Integration Services包含许多执行维护工作的任务。其中之一是Shrink Database Task。 SQL Server包含wizard,可以帮助您编写和安排工作。

可以使用SQL Agent安排这两种方法。

修改

已更正的查询,其中包含未声明的变量。