答えでSQLを実行すると、nvarcharがオーバーフローしました。問題は、データベースにSQLが長すぎてnvarcharに長すぎるテーブルがある場合です。私のデータベースにはvarchar(nvarcharの2倍の長さ)をオーバーフローさせるのに十分なテーブルがありました。そこで、各テーブルをループして別々のステートメントを実行するようにSQLを編集しました。この方法では、あなたのテーブルの統計情報を更新するのを忘れてしまいます。
ALTER DATABASE MyDatabase SET COMPATIBILITY_LEVEL = 110;
DECLARE @SQL NVARCHAR(MAX) = N'';
Declare @Tables table
([Schema] nvarchar(50)
,[TableName] nvarchar(100))
Insert into @Tables
Select QUOTENAME(SCHEMA_NAME(schema_id)),QUOTENAME(name)
FROM sys.tables;
Declare @Schema nvarchar(50), @TableName nvarchar(100)
While Exists(Select * From @Tables)
Begin
Select Top 1 @Schema = [Schema], @TableName = [TableName] From @Tables
Set @SQL = 'UPDATE STATISTICS ' + @Schema + '.' + @TableName + ' WITH FULLSCAN;'
Begin Try
EXEC SP_ExecuteSql @SQLToExecute = @SQL
Print 'Completed: ' + @SQL
End Try
Begin Catch
DECLARE @ErrMsg nvarchar(4000)
SELECT @ErrMsg = SubString(ERROR_MESSAGE(),0,900)
Select GetDate(), 'Failed updating stats on ' + @Schema + ' ' + @TableName + '. Error: '[email protected]
End Catch
Delete From @Tables Where [Schema] = @Schema and [TableName] = @TableName
End
私のデータベースは水平パーティショニングを使用しているため、元のデータベースのすてきな機能をすべて保持する必要があります。 – Contango