Saya memiliki prosedur tersimpan yang mengembalikan 80 kolom, dan 300 baris. Saya ingin menulis pilih yang mendapat 2 kolom tersebut. Sesuatu seperti
SELECT col1, col2 FROM EXEC MyStoredProc 'param1', 'param2'
Ketika saya menggunakan sintaks di atas saya mendapatkan kesalahan:
"Nama Kolom Tidak Valid".
Saya tahu solusi termudah adalah mengubah prosedur yang tersimpan, tetapi saya tidak menulisnya, dan saya tidak bisa mengubahnya.
Apakah ada cara untuk melakukan apa yang saya inginkan?
Saya bisa membuat tabel temp untuk memasukkan hasilnya, tetapi karena ada 80 kolom jadi saya perlu membuat tabel temp 80 kolom hanya untuk mendapatkan 2 kolom. Saya ingin menghindari melacak semua kolom yang dikembalikan.
Saya mencoba menggunakan
WITH SprocResults AS ....
seperti yang disarankan oleh Mark, tetapi saya mendapat 2 kesalahanSintaksis salah di dekat kata kunci 'EXEC'.
Sintaksis salah dekat ')'.Saya mencoba mendeklarasikan variabel tabel dan saya mendapatkan kesalahan berikut
Sisipkan Kesalahan: Nama kolom atau jumlah nilai yang diberikan tidak cocok dengan definisi tabel
Jika saya mencoba
SELECT * FROM EXEC MyStoredProc 'param1', 'param2'
saya mendapatkan kesalahan:Sintaksis salah di dekat kata kunci 'exec'.
sumber
EXEC
bukan kata kunci MySQL (padanan yang dipersiapkan MySQL adalah pernyataan ) Meskipun saya ingin tahu jawaban untuk MySQL, jawaban di bawah ini menargetkan T-SQL. Retagging.Jawaban:
Bisakah Anda membagi kueri? Masukkan hasil proc yang disimpan ke dalam variabel tabel atau tabel temp. Kemudian, pilih 2 kolom dari variabel tabel.
sumber
Berikut ini tautan ke dokumen yang cukup bagus menjelaskan semua cara berbeda untuk menyelesaikan masalah Anda (walaupun banyak dari mereka tidak dapat digunakan karena Anda tidak dapat mengubah prosedur tersimpan yang ada.)
Cara Berbagi Data Antara Prosedur yang Disimpan
Jawaban Gulzar akan bekerja (ini didokumentasikan dalam tautan di atas) tetapi akan merepotkan untuk menulis (Anda harus menentukan semua 80 nama kolom dalam pernyataan @tablevar (col1, ...) Anda. Dan di masa mendatang jika kolom ditambahkan ke skema atau output diubah, maka perlu diperbarui dalam kode Anda atau akan keluar kesalahan.
sumber
Sumber:
http://stevesmithblog.com/blog/select-from-a-stored-procedure/
sumber
Ini berfungsi untuk saya: (yaitu saya hanya membutuhkan 2 kolom dari 30+ yang dikembalikan oleh
sp_help_job
)Sebelum ini berhasil, saya perlu menjalankan ini:
.... untuk memperbarui
sys.servers
tabel. (mis. Menggunakan referensi-sendiri dalam OPENQUERY tampaknya dinonaktifkan secara default.)Untuk persyaratan sederhana saya, saya tidak menemukan masalah yang dijelaskan di bagian OPENQUERY dari tautan luar biasa Lance.
Rossini, jika Anda perlu mengatur parameter input secara dinamis, maka penggunaan OPENQUERY menjadi sedikit lebih fiddly:
Saya tidak yakin tentang perbedaan (jika ada) antara menggunakan
sp_serveroption
untuk memperbaruisys.servers
referensi diri yang ada secara langsung, vs menggunakansp_addlinkedserver
(seperti yang dijelaskan dalam tautan Lance) untuk membuat duplikat / alias.Catatan 1: Saya lebih suka OPENQUERY daripada OPENROWSET, mengingat bahwa OPENQUERY tidak memerlukan definisi string-koneksi dalam proc.
Catatan 2: Setelah mengatakan semua ini: biasanya saya hanya akan menggunakan INSERT ... EXEC :) Ya, ini adalah pengetikan ekstra 10 menit, tetapi jika saya dapat membantu, saya lebih suka untuk tidak bermain-main dengan:
(a) kutipan dalam tanda kutip di dalam kutipan, dan
(b) tabel sistem, dan / atau pengaturan Linked Linked server referensi diri licik (yaitu untuk ini, saya perlu memohon kasus saya untuk semua DBA kuat kami :)
Namun dalam contoh ini, saya tidak bisa menggunakan INSERT ... EXEC, seperti
sp_help_job
yang sudah digunakan. ("Pernyataan INSERT EXEC tidak dapat disarangkan.")sumber
Untuk mencapai ini, pertama Anda buat
#test_table
seperti di bawah ini:Sekarang jalankan prosedur dan beri nilai
#test_table
:Sekarang Anda mengambil nilai dari
#test_table
:sumber
Jika Anda dapat memodifikasi prosedur tersimpan Anda, Anda dapat dengan mudah menempatkan definisi kolom yang diperlukan sebagai parameter dan menggunakan tabel sementara yang dibuat secara otomatis:
Dalam hal ini Anda tidak perlu membuat tabel temp secara manual - ini dibuat secara otomatis. Semoga ini membantu.
sumber
Mungkin bermanfaat untuk mengetahui mengapa ini sangat sulit. Prosedur tersimpan hanya dapat mengembalikan teks (cetak 'teks'), atau dapat mengembalikan beberapa tabel, atau mungkin tidak mengembalikan tabel sama sekali.
Jadi sesuatu seperti
SELECT * FROM (exec sp_tables) Table1
tidak akan berfungsisumber
(Mengasumsikan SQL Server)
Satu-satunya cara untuk bekerja dengan hasil prosedur yang tersimpan di T-SQL adalah dengan menggunakan
INSERT INTO ... EXEC
sintaks. Itu memberi Anda opsi memasukkan ke dalam tabel temp atau variabel tabel dan dari sana memilih data yang Anda butuhkan.sumber
Peretasan cepat adalah dengan menambahkan parameter baru
'@Column_Name'
dan membuat fungsi panggilan menentukan nama kolom yang akan diambil. Di bagian pengembalian sproc Anda, Anda akan memiliki pernyataan if / else dan hanya mengembalikan kolom yang ditentukan, atau jika kosong - kembalikan semua.sumber
Jika Anda melakukan ini untuk validasi data secara manual, Anda dapat melakukannya dengan LINQPad.
Buat koneksi ke database di LinqPad kemudian buat pernyataan C # yang mirip dengan yang berikut:
Referensi http://www.global-webnet.net/blogengine/post/2008/09/10/LINQPAD-Using-Stored-Procedures-Accessing-a-DataSet.aspx
sumber
Untuk SQL Server, saya menemukan ini berfungsi dengan baik:
Buat tabel temp (atau tabel permanen, tidak terlalu penting), dan lakukan penyisipan terhadap prosedur tersimpan. Rangkaian hasil SP harus cocok dengan kolom di tabel Anda, jika tidak Anda akan mendapatkan kesalahan.
Ini sebuah contoh:
Itu dia!
sumber
Seperti yang telah disebutkan dalam pertanyaan, sulit untuk menentukan tabel temp 80 kolom sebelum menjalankan prosedur tersimpan.
Jadi cara sebaliknya adalah mengisi tabel berdasarkan pada set hasil prosedur tersimpan.
Jika Anda mendapatkan kesalahan, Anda harus mengaktifkan kueri yang didistribusikan secara ad hoc dengan menjalankan kueri berikut.
Untuk mengeksekusi
sp_configure
dengan kedua parameter untuk mengubah opsi konfigurasi atau untuk menjalankanRECONFIGURE
pernyataan, Anda harus diberikanALTER SETTINGS
izin tingkat serverSekarang Anda dapat memilih kolom spesifik Anda dari tabel yang dihasilkan
sumber
coba ini
sumber
Saya tahu mengeksekusi dari sp dan memasukkan ke dalam tabel temp atau variabel tabel akan menjadi pilihan tapi saya tidak berpikir itu kebutuhan Anda. Sesuai kebutuhan Anda, pernyataan kueri di bawah ini akan berfungsi:
jika Anda memiliki koneksi tepercaya maka gunakan pernyataan kueri di bawah ini:
jika Anda mendapatkan kesalahan untuk menjalankan pernyataan di atas maka jalankan saja pernyataan ini di bawah:
Saya harap ini akan membantu seseorang yang akan menghadapi masalah serupa ini. Jika seseorang ingin mencoba dengan tabel temp atau variabel tabel yang seharusnya seperti ini di bawah ini tetapi dalam skenario ini Anda harus tahu berapa banyak kolom sp Anda kembali maka Anda harus membuat banyak kolom dalam tabel temp atau variabel tabel:
sumber
Bagi siapa pun yang memiliki SQL 2012 atau lebih baru, saya bisa menyelesaikan ini dengan prosedur tersimpan yang tidak dinamis dan memiliki output kolom yang sama setiap kali.
Gagasan umum adalah saya membuat kueri dinamis untuk membuat, menyisipkan ke dalam, memilih dari, dan menjatuhkan tabel temp, dan jalankan ini setelah semuanya dihasilkan. Saya secara dinamis menghasilkan tabel temp dengan terlebih dahulu mengambil nama dan tipe kolom dari prosedur tersimpan .
Catatan: ada banyak solusi yang lebih baik dan lebih universal yang akan bekerja dengan lebih sedikit baris kode jika Anda bersedia / dapat memperbarui SP atau mengubah konfigurasi dan penggunaan
OPENROWSET
. Gunakan di bawah ini jika Anda tidak punya cara lain.sumber
Cara termudah untuk dilakukan jika Anda hanya perlu ini sekali:
Ekspor ke excel di Impor dan Ekspor panduan dan kemudian impor excel ini ke dalam tabel.
sumber
Buat tampilan dinamis dan dapatkan hasilnya dari .......
sumber
Saya akan memotong dan menempelkan SP asli dan menghapus semua kolom kecuali 2 yang Anda inginkan. Atau. Saya akan mengembalikan set hasil, memetakannya ke objek bisnis yang tepat, lalu LINQ keluar dua kolom.
sumber