KB2322209-memperbaiki: hasil yang salah jika Anda menggunakan tanda kurung di sekitar pilih dalam pernyataan yang memiliki ekspresi tabel umum di SQL Server 2008


Gejala


Di komputer yang menjalankan Microsoft SQL Server 2008, Pertimbangkan skenario berikut ini.

Skenario 1

Anda menentukan ekspresi tabel Umum (CTE) dengan menggunakan pernyataan WITH. Misalnya, Anda menjalankan kueri berikut ini.
WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)
Lalu, Anda menjalankan kueri ini.
SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1
Dalam skenario ini, rencana kueri singgahan untuk kueri ini menyimpan nilai statement_start_offset dan statement_end_offset yang salah. Khususnya, Anda melihat nilai statement_end_offset lebih kecil dari nilai statement_start_offset saat Anda sys.dm_exec_query_stats menjalankan tampilan manajemen dinamis (DMV). Karena masalah ini, laporan kinerja mungkin gagal saat laporan mengasumsikan bahwa nilai statement_start_offset lebih kecil dari nilai statement_stop_offset.

Skenario 2

Anda menentukan ekspresi tabel umum dengan menggunakan pernyataan WITH, dan Anda menggunakan opsi MENGKOMPILASI ulang. Misalnya, Anda membuat fungsi di SQL Server 2008 dengan menggunakan skrip berikut ini.
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
Saat Anda menjalankan kueri "Pilih DBO. function1 ()", Anda menerima pesan kesalahan berikut:
Terjadi kesalahan parah pada perintah saat ini. Hasilnya, jika ada, harus dibuang.
Selain itu, kesalahan ini bisa terjadi tanpa opsi MENGKOMPILASI ulang jika Server SQL mengalami Traffic server yang padat.

Skenario 3

Anda menentukan ekspresi tabel umum dengan menggunakan pernyataan WITH. Dalam pernyataan WITH, Anda menentukan tabel yang tidak ada. Misalnya, Anda menjalankan kueri berikut ini.
WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO
Saat Anda menjalankan kueri ini, Anda tidak menerima kesalahan untuk tabel yang hilang.

Penyebab


Masalah ini terjadi karena pemrosesan yang tidak berfungsi dari pernyataan SELECT yang mengikuti pernyataan dengan. Pernyataan WITH menggunakan sintaks berikut ini.
WITH common_table_expression AS(CTE_query_definition)
Pernyataan ini kemudian membuat rangkaian hasil yang ditetapkan ke nama ekspresi tabel umum yang ditentukan. Lalu, Anda mengikuti Pernyataan ini dengan pernyataan SELECT. Jika pernyataan kedua ini dicantumkan dalam tanda kurung, lalu Anda mencoba melakukan operasi pada hasil atau Anda mencoba menjalankan tampilan manajemen sys.dm_exec_query_stats dinamis, Anda menerima hasil yang salah atau kesalahan.

Pemecahan Masalah


Informasi paket layanan Untuk mengatasi masalah ini, Dapatkan paket layanan terbaru untuk SQL Server 2008. Untuk informasi selengkapnya, klik nomor artikel berikut untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
968382 Cara mendapatkan paket layanan terbaru untuk SQL Server 2008

Penyelesaian Masalah


Untuk mengatasi masalah ini, Anda harus menghapus tanda kurung dari pernyataan yang mengikuti ekspresi tabel umum. Misalnya, pertimbangkan hal berikut ini dengan pernyataan yang menggunakan tanda kurung tersebut.
WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)
Untuk mengatasi masalah ini, Ubah ke berikut ini dengan pernyataan yang tidak menggunakan tanda kurung ini.
WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio

Status


Microsoft telah mengonfirmasikan bahwa ini adalah masalah di produk Microsoft yang tercantum di bagian "berlaku untuk". Masalah ini pertama kali dikoreksi di SQL Server 2008 Service Pack 2 (SP2).

Informasi Selengkapnya


Untuk informasi selengkapnya tentang cara menggunakan pernyataan WITH dengan ekspresi tabel yang sama, kunjungi situs web MSDN berikut:Untuk informasi selengkapnya tentang sys.dm_exec_query_stats, kunjungi situs web MSDN berikut: