Memaksa Kueri Jarak Jauh SQL untuk memfilter dari jarak jauh, bukan secara lokal

Saya memiliki MS SQL Query yang menarik data dari server jauh. Data yang saya tarik perlu difilter berdasarkan tanggal yang ditentukan pada saat run time.. Saat saya menjalankan kueri seperti ini:

SELECT * FROM SERVER.Database.dbo.RemoteView
WHERE EntryDate > '1/1/2009'

kemudian filter diterapkan dari jarak jauh... Namun, saya sebenarnya tidak ingin menggunakan '1/1/2009' sebagai tanggal - saya ingin tanggal diberikan oleh fungsi yang ditentukan pengguna, seperti ini:

SELECT * FROM SERVER.Database.dbo.RemoteView
WHERE EntryDate > dbo.MyCustomCLRDateFunction()

di mana fungsinya adalah fungsi bernilai skalar CLR khusus yang mengembalikan waktu tanggal... (Anda mungkin bertanya mengapa saya perlu melakukan ini... detailnya agak rumit, jadi percayalah - saya harus lakukan dengan cara ini.)

Saat saya menjalankan kueri ini, kueri jarak jauh TIDAK difilter dari jarak jauh - pemfilteran dilakukan setelah semua data ditarik ke bawah (400.000 baris vs 100.000 baris) dan itu membuat perbedaan yang signifikan.

Apakah ada cara agar saya dapat memaksa kueri untuk melakukan pemfilteran dari jarak jauh?

Terima kasih!


person Michael Bray    schedule 12.10.2009    source sumber


Jawaban (3)


Tidak bisakah Anda mengirimkan kueri seperti ini saja, atau apakah fungsi clr harus dipanggil di dalam pernyataan pilih?

Declare @datetime datetime
Set @datetime = dbo.MyCustomCLRDateFunction()

SELECT * FROM SERVER.Database.dbo.RemoteView
WHERE EntryDate > @datetime
person Gordon Tucker    schedule 12.10.2009
comment
Kamu tahu apa yang lucu? Solusi yang sama disarankan oleh pengguna lain, tetapi saya katakan saya tidak bisa melakukannya karena kueri sebenarnya dibuat secara dinamis oleh lapisan data WTF yang memilih kolom yang ingin dilihatnya, cara mengelompokkan data, cara mengurutkan, dll. ... Saya tidak berpikir saya akan dapat menggunakan jawaban ini karena semuanya dieksekusi sebagai kueri yang dibuat. Namun jika dilihat lebih jauh, saya rasa saya hampir tidak memiliki fleksibilitas yang cukup dalam cara pembuatannya agar solusi ini dapat berfungsi. Dalam pengujian, tampaknya berhasil. - person Michael Bray; 13.10.2009
comment
Oke jadi saya telah berhasil mengimplementasikan ini di lingkungan pengembang... Seperti yang saya duga, sistem WTF memiliki fleksibilitas yang cukup sehingga saya bisa memasukkan kode jenis ini sebelum memilih. Pelajaran yang bisa diambil disini adalah jangan langsung mengabaikan solusi yang mungkin ada tanpa memikirkannya terlebih dahulu. Terima kasih! - person Michael Bray; 13.10.2009

Anda juga dapat membuat string dan menggunakan openquery ...

set @sqlString =
 ' select into myTable from openquery
    (remoteServer,
        "SELECT * FROM Database.dbo.RemoteView WHERE EntryDate > %DTSTART"
    )
 '

set @sqlString  = 
    replace(@sqlString, '%DTSTART', 
                        (select cast(dbo.MyCustomCLRDateFunction() as char(8)) 
           )

EXECUTE sp_executesql @stmt=@sqlString
person cindi    schedule 13.10.2009

Anda perlu mendekorasi dengan benar fungsi CLR Anda agar tandai sebagai Deterministik, Tepat, dan Akses Data/Akses Data Sistem sebagai DataAccessKind.None.

person Remus Rusanu    schedule 12.10.2009
comment
Hmm Saya pikir menandainya deterministik, tapi sebenarnya tidak... dalam hal ini, itu akan mengembalikan nilai yang sama SEBAGIAN besar waktu, tapi tentu saja tidak SELALU. Saya tidak yakin apa yang dilakukan orang lain... bisakah Anda menjelaskannya lebih lanjut? - person Michael Bray; 13.10.2009
comment
Dari mana dbo.MyCustomCLRDateFunction membuat tanggal pengembalian? Apakah Anda mencari tabel? Apakah keluarannya bergantung pada waktu saat ini? Jika Anda tidak dapat menandai keluaran sebagai deterministik, kecil kemungkinannya untuk mengelabui eksekusi kueri untuk memfilter dari jarak jauh. - person Remus Rusanu; 13.10.2009
comment
Sebenarnya saya menanyakan satu pertanyaan ini, tetapi kenyataannya saya memiliki sekitar 10 fungsi berbeda yang digunakan dengan cara berbeda. Ada yang bergantung pada waktu, ada pula yang tidak, namun tidak semuanya dijamin SELALU mengembalikan nilai yang sama untuk serangkaian argumen tertentu. Yang benar, saya pasti akan menandainya seperti itu. Selain itu, bukankah DataAccessKind.None adalah defaultnya? - person Michael Bray; 13.10.2009