メイン コンテンツへスキップ
サポート
Microsoft アカウントでサインイン
サインインまたはアカウントを作成してください。
こんにちは、
別のアカウントを選択してください。
複数のアカウントがあります
サインインに使用するアカウントを選択してください。

現象

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 ページを参照してください。

sys.dm_exec_query_stats (Transact-sql)

ヘルプを表示

その他のオプションが必要ですか?

サブスクリプションの特典の参照、トレーニング コースの閲覧、デバイスのセキュリティ保護方法などについて説明します。

コミュニティは、質問をしたり質問の答えを得たり、フィードバックを提供したり、豊富な知識を持つ専門家の意見を聞いたりするのに役立ちます。

この情報は役に立ちましたか?

言語の品質にどの程度満足していますか?
どのような要因がお客様の操作性に影響しましたか?
[送信] を押すと、Microsoft の製品とサービスの改善にフィードバックが使用されます。 IT 管理者はこのデータを収集できます。 プライバシーに関する声明。

フィードバックをいただき、ありがとうございます。

×