我试图通过我在表中列出的多个数据库循环查询,我尝试使用游标并使用新的数据库名称切换出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的表中
答案 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社区中被广泛使用并备受推崇。