使用游标循环使用多个数据库的查询

时间:2017-12-31 16:35:46

标签: sql-server dynamic-sql

我试图通过我在表中列出的多个数据库循环查询,我尝试使用游标并使用新的数据库名称切换出USE语句,但我在'@附近继续获得不正确的语法数据库名”。有没有办法做到这一点?以下是我的尝试。

DECLARE  @DBName  varchar (100)
DECLARE  @Sql  varchar (100)
DECLARE  @Table   varchar (100) 
DECLARE  @IndexName varchar (100)
DECLARE TableCursor CURSOR FOR
select DBName,[Table],IndexName from IndexOverview_FragLevels
OPEN TableCursor            
FETCH NEXT FROM TableCursor INTO @DBName, @Table, @IndexName                                                                                            
WHILE @@FETCH_STATUS = 0
BEGIN
use @DBName;
DBCC DBREINDEX (@Table ,@IndexName, 90);
FETCH NEXT FROM TableCursor INTO @DBName,@Table,@IndexName
END
close TableCursor
DEALLOCATE TableCursor

在这段代码中,我将从多个数据库重新索引表。其中的数据存储在名为IndexOverview_FragLevels的表中

1 个答案:

答案 0 :(得分:0)

您需要在动态SQL批处理中执行该命令以设置数据库上下文。以下是参数化查询示例:

DECLARE @SQL nvarchar(MAX) = N'USE ' + QUOTENAME(@DBName) + N';
    DBCC DBREINDEX (@Table, @IndexName, 90);';
EXECUTE sp_executesql
     @SQL
    ,N'@Table sysname, @IndexName sysname'
    ,@Table = @Table
    ,@IndexName = @IndexName;

不要重新发明轮子,而应考虑使用Ola Hallengren's T-SQL maintenance solution,它在SQL Server社区中被广泛使用并备受推崇。