内部光标的问题是范围。你可以在这里做两件事。您必须将内部光标移到
USE [' + @db
像:
DECLARE @db VARCHAR(128);
DECLARE @cmd VARCHAR(1024);
DECLARE @table VARCHAR(255);
DECLARE @cmd2 VARCHAR(1024);
DECLARE crDB CURSOR GLOBAL READ_ONLY FORWARD_ONLY FOR
SELECT name
FROM sys.databases
WHERE database_id > 4
AND database_id IN (33)
ORDER BY name;
OPEN crDB;
FETCH crDB
INTO @db;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @cmd = 'USE [' + @db + ']
GO;
DECLARE crTB CURSOR LOCAL FAST_FORWARD FOR
SELECT name
FROM sys.objects
WHERE type = ''u'';
ORDER BY name;
OPEN crTB;
FETCH NEXT FROM crTB
INTO @table;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @cmd2 = ''Update Statistics '' + @table + CHAR(13);
PRINT @cmd2;
EXEC (@cmd2);
END;
CLOSE crTB;
DEALLOCATE crTB;
';
EXEC (@cmd);
FETCH NEXT FROM crDB
INTO @db;
END;
CLOSE crDB;
DEALLOCATE crDB;
或者,您可以完全去掉内部光标,并使用sys.sp msforeachtable:
WHILE @@FETCH_STATUS = 0
BEGIN
SET @cmd = 'USE [' + @db + ']
GO;
EXEC sys.sp_MSforeachtable @command1 = ''UPDATE STATISTICS ?;''';
EXEC (@cmd);