現象
Microsoft SQL Server 2008 を実行しているコンピューターの場合は、次のシナリオを検討してください。
シナリオ 1
WITH ステートメントを使って共通テーブル式 (CTE) を指定します。 たとえば、次のクエリを実行します。
WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)
次に、このクエリを実行します。
SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1
このシナリオでは、このクエリのキャッシュされたクエリプランには、不適切な statement_start_offset と statement_end_offset の値が保存されています。 具体的には、sys.dm_exec_query_stats 動的管理ビュー (DMV) を実行すると、statement_end_offset の値が statement_start_offset の値よりも小さくなっていることがわかります。この問題のため、レポートで statement_start_offset 値が statement_stop_offset 値より常に小さいと判断される場合、パフォーマンスレポートが失敗することがあります。
シナリオ 2
WITH ステートメントを使って共通テーブル式を指定し、[再コンパイル] オプションを使用します。 たとえば、次のスクリプトを使用して、SQL Server 2008 で関数を作成します。
CREATE FUNCTION function1() RETURNS int ASBEGINDECLARE @x intSET @x=1;WITH common_table_expression AS (SELECT @x AS column1) (SELECT @x=column1 FROM common_table_expression) OPTION(RECOMPILE)RETURN @xEND
"Function1 () の選択" クエリを実行すると、次のエラーメッセージが表示されます。
現在のコマンドで重大なエラーが発生しました。 結果は破棄する必要があります。
また、SQL server のサーバートラフィックが重い場合、このエラーは再コンパイルオプションなしで発生する可能性があります。
シナリオ 3
WITH ステートメントを使って共通テーブル式を指定します。 WITH ステートメントで、存在しないテーブルを指定します。 たとえば、次のクエリを実行します。
WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO
このクエリを実行すると、不足しているテーブルに対してエラーが表示されません。
原因
これらの問題は、if ステートメントの後に続く SELECT ステートメントの処理が誤動作したために発生します。 WITH ステートメントでは、次の構文を使用します。
WITH common_table_expression AS(CTE_query_definition)
次に、指定された共通テーブル式の名前に割り当てられた結果セットを作成します。 次に、SELECT ステートメントを使ってこのステートメントを実行します。 この2番目のステートメントがかっこで囲まれている場合、その結果に対して操作を実行するか、sys.dm_exec_query_stats 動的管理ビューを実行しようとすると、間違った結果またはエラーが表示されます。
解決方法
Service pack の情報 この問題を解決するには、SQL Server 2008 の最新の service pack を入手してください。 詳細については、次のマイクロソフト サポート技術情報番号をクリックしてください。
968382 SQL Server 2008 の最新の Service Pack を入手する方法
回避策
このような問題を回避するには、共通テーブル式の後にあるステートメントからかっこを削除する必要があります。 たとえば、次のようなかっこを使用しているステートメントがあるとします。
WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)
このような問題を回避するには、かっこを使用しない次のステートメントに変更します。
WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio
状態
Microsoft は、この問題は「適用対象」セクションに記載されている Microsoft 製品の問題であることを確認しています。この問題は、SQL Server 2008 Service Pack 2 (SP2) で最初に修正されました。
詳細情報
一般的なテーブル式で WITH ステートメントを使用する方法の詳細については、次の MSDN web ページを参照してください。
Common_table_expression (Transact-sql)Sys.dm_exec_query_stats の詳細については、次の MSDN web ページを参照してください。