Dalam Microsoft SQL Server 2008, sintaks menghasilkan kesalahan "Fitur Parallel Data Warehouse (PDW) tidak diaktifkan."

8

Saya memiliki kolom virtual berikut yang dihasilkan dari agregat di atas partisi yang diurutkan,

MIN(picture_id) OVER ( PARTITION BY [360_set] ORDER BY picture_id ASC )

Namun, ketika saya mengeksekusi itu, saya mendapatkan yang berikut.

Msg 11305, Level 15, State 10, Line 12
The Parallel Data Warehouse (PDW) features are not enabled.

Di sinilah ia menjadi menarik, tanpa urutan di partisi, ia berfungsi:

MIN(picture_id) OVER ( PARTITION BY [360_set] )

Dan, lebih jauh, ROW_NUMBER()fungsi jendela (bukan fungsi agregat) bekerja dengan urutan eksplisit pada partisi.

ROW_NUMBER() OVER ( PARTITION BY [360_set] ORDER BY picture_id ASC )

Kenapa pernyataan yang diinginkan tidak berhasil? Di mana ini didokumentasikan? Informasi versi diminta, inilah yang saya dalam Bantuan → Tentang.

Microsoft SQL Server Management Studio          10.0.5512.0
Microsoft Analysis Services Client Tools        10.0.5500.0
Microsoft Data Access Components (MDAC)         6.1.7601.17514
Microsoft MSXML                                 3.0 6.0 
Microsoft Internet Explorer                     9.10.9200.16635
Microsoft .NET Framework                        2.0.50727.5472
Operating System                                6.1.7601

Hasil dari SELECT @@VERSIONisMicrosoft SQL Server 2008 (SP3) - 10.0.5512.0 (X64) Aug 22 2012 19:25:47 Copyright (c) 1988-2008 Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (VM)

Evan Carroll
sumber
Apa versi tepatnya? Sepertinya ada bug. Saya mendapatkan kesalahan sintaks normal untuk contoh pertama pada 10.50.1600. Selain itu, saya tidak mengerti maksudnya - apa yang Anda coba lakukan dengan sintaks ini?
Jon Seigel
Jadi, apakah Anda benar-benar peduli tentang mempartisi peringkat oleh [360_set], atau bagian itu tidak relevan? Juga, dari komentar Anda, rumus yang Anda berikan hanya berfungsi seperti deskripsi teks jika tidak ada kesenjangan dalam urutan. Yang kamu inginkan
Jon Seigel
2
Urutan demi klausa untuk agregat tidak diterapkan hingga SQL Server 2012. Tidak yakin apa ekstensi PDW itu.
Martin Smith
2
@ JonSeigel Ini mengatur urutan baris untuk bingkai jendela. Itu tidak mempengaruhi cara MINkerjanya tentu saja, tetapi itu mengubah baris dalam bingkai yang MINdilakukan.
Paul White 9
1
@JonSeigel - Default jika tidak ditentukan adalah RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. Jadi jendela hanya menyertakan nilai dengan picture_idnilai kurang dari atau sama dengan yang ada di baris saat ini.
Martin Smith

Jawaban:

16

Fitur Parallel Data Warehouse (PDW) tidak diaktifkan.

Ini adalah bug parser yang hanya ada di SQL Server 2008. Versi SQL Server non-PDW sebelum 2012 tidak mendukung ORDER BYklausa dengan fungsi agregat seperti MIN:

Ekstrak Buku Online

Dukungan fungsi windowing sangat diperpanjang pada tahun 2012, dibandingkan dengan implementasi dasar yang tersedia mulai dengan SQL Server 2005. Ekstensi dibuat tersedia di Gudang Data Paralel sebelum dimasukkan dalam produk kotak. Karena berbagai edisi berbagi basis kode yang umum, pesan kesalahan yang menyesatkan seperti ini dimungkinkan.

Jika Anda tertarik, tumpukan panggilan saat agregat diverifikasi oleh parser ditunjukkan di bawah ini. Karena agregat memiliki OVERklausa dengan ORDER BY, cek untuk PDW dikeluarkan:

Verifikasi agregat

Pemeriksaan ini segera gagal dengan kesalahan parser:

Kesalahan Parser

Untungnya, Anda tidak memerlukan agregat berjendela yang mendukung ORDER BYpembingkaian untuk menyelesaikan masalah kode Anda.

Paul White 9
sumber
2

Ini akan menjadi hasil dari penggabungan basis kode PDW, Azure dan versi kotak. Kami akan mulai melihat pesan seperti ini atau bahwa Anda tidak menggunakan mesin Azure saat mencoba melakukan hal-hal yang hanya dirilis di Azure.

Adapun pertanyaan Martin tentang apa ekstensi PDW itu, ini akan menjadi fitur dari bahasa T-SQL yang hanya diimplementasikan dalam produk Parallel Data Warehouse (PDW).

mrdenny
sumber
Bisakah ini diaktifkan melalui peretasan? Atau, apakah mereka tidak dikirim bersama produk? Saya hanya ingin tahu apakah mereka serius menarik fitur yang belum sempurna? Ini tidak rumit untuk penggunaan DB.
Evan Carroll
3
@EvanCarroll Tidak, ORDER BYdengan agregat berjendela tidak dapat diaktifkan di SQL Server 2008. Fitur ini tidak 'ditarik', itu tidak dirilis untuk SQL Server non-PDW hingga rilis 2012.
Paul White 9
1

Menjawab ini sebagai elemen pesan kesalahan. Seperti @MartinSmith katakan di atas,

Urutan demi klausa untuk agregat tidak diterapkan hingga SQL Server 2012. Tidak yakin apa ekstensi PDW itu. - Martin Smith

Ini disebutkan secara resmi di sini SQL Server 2008 R2 - OVER Clause (Transact-SQL)

Ketika digunakan dalam konteks fungsi peringkat jendela, hanya bisa merujuk ke kolom yang disediakan oleh klausa FROM. Bilangan bulat tidak dapat ditentukan untuk mewakili posisi nama atau alias kolom dalam daftar pilih. tidak dapat digunakan dengan fungsi jendela agregat.

Yang lebih penting adalah verbiage di SQL Server 2012 - OVER Clause (Transact-SQL)

Bergantung pada fungsi peringkat, agregat, atau analitik yang digunakan dengan klausa OVER, dan / atau yang mungkin tidak didukung.

Jadi, sepertinya itu tentu tidak tersedia pada tahun 2008 - meskipun pesan kesalahan adalah cara yang sangat jelas mengatakan "tidak dilaksanakan" , dan pada tahun 2012 sepertinya sikap resmi Microsoft adalah Anda mungkin berbeda .

Evan Carroll
sumber