it-swarm.asia

SQL Server - PILIH DARI prosedur tersimpan

Saya memiliki prosedur tersimpan yang mengembalikan baris:

CREATE PROCEDURE MyProc
AS
BEGIN
    SELECT * FROM MyTable
END

Prosedur saya yang sebenarnya sedikit lebih rumit, itulah mengapa sproc diperlukan.

Apakah mungkin untuk memilih output dengan memanggil prosedur ini?

Sesuatu seperti:

SELECT * FROM (EXEC MyProc) AS TEMP

Saya perlu menggunakan SELECT TOP X, ROW_NUMBER, dan klausa WHERE tambahan untuk halaman data saya, dan saya tidak benar-benar ingin meneruskan nilai-nilai ini sebagai parameter.

290
jonathanpeppers

Anda dapat menggunakan fungsi yang ditentukan pengguna atau tampilan alih-alih prosedur.

Prosedur dapat mengembalikan beberapa set hasil, masing-masing dengan skema sendiri. Itu tidak cocok untuk digunakan dalam pernyataan SELECT.

136
Mehrdad Afshari

Kamu bisa

  1. buat variabel tabel untuk menampung set hasil dari proc yang disimpan lalu
  2. masukkan output dari proc yang disimpan ke dalam variabel tabel, dan kemudian
  3. gunakan variabel tabel persis seperti yang Anda lakukan pada tabel lain ...

... sql ....

Declare @T Table ([column definitions here])
Insert @T Exec storedProcname params 
Select * from @T Where ...
161
Charles Bretana

Anda harus melihat artikel yang sangat bagus ini oleh Erland Sommarskog:

Pada dasarnya daftar semua opsi yang tersedia untuk skenario Anda.

149
kristof

Anda menginginkan fungsi Table-Valued atau memasukkan EXEC Anda ke tabel sementara:

INSERT INTO #tab EXEC MyProc
69
CMerat

Anda harus membaca tentang OPENROWSET dan OPENQUERY

SELECT  * 
INTO    #tmp FROM    
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
41
Rizwan Mumtaz

Anda perlu mendeklarasikan tipe tabel yang berisi jumlah kolom yang sama dengan prosedur toko Anda. Tipe data kolom dalam tipe tabel dan kolom yang dikembalikan oleh prosedur harus sama

declare @MyTableType as table
(
FIRSTCOLUMN int
,.....
)  

Maka Anda perlu memasukkan hasil prosedur tersimpan Anda dalam jenis tabel Anda yang baru saja Anda tentukan

Insert into @MyTableType 
EXEC [dbo].[MyStoredProcedure]

Pada akhirnya cukup pilih dari jenis tabel Anda

Select * from @MyTableType
32
Aamir

Tidak perlu menggunakan tabel sementara.

Ini solusi saya

SELECT  *  FROM    
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
WHERE somefield = anyvalue
32
DavideDM

gunakan OPENQUERY dan sebelum Jalankan set 'SET FMTONLY OFF; SET NOCOUNT AKTIF; '

Coba kode contoh ini:

SELECT top(1)*
FROM
OPENQUERY( [Server], 'SET FMTONLY OFF; SET NOCOUNT ON; EXECUTE  [database].[dbo].[storedprocedure]  value,value ')
6

Jika 'DATA ACCESS' salah,

EXEC sp_serveroption 'SQLSERVERNAME', 'DATA ACCESS', TRUE

setelah,

SELECT  *  FROM OPENQUERY(SQLSERVERNAME, 'EXEC DBNAME..MyProc @parameters')

berhasil.

6
Ali Osman Yavuz

Coba ubah prosedur Anda menjadi Fungsi Inline yang mengembalikan tabel sebagai berikut:

CREATE FUNCTION MyProc()
RETURNS TABLE AS
RETURN (SELECT * FROM MyTable)

Dan kemudian Anda bisa menyebutnya sebagai

SELECT * FROM MyProc()

Anda juga memiliki opsi untuk meneruskan parameter ke fungsi sebagai berikut:

CREATE FUNCTION FuncName (@para1 para1_type, @para2 para2_type , ... ) 

Dan sebut saja

SELECT * FROM FuncName ( @para1 , @para2 )
5
al_the_man

Anda bisa sedikit curang dengan OPENROWSET:

SELECT ...fieldlist...
FROM OPENROWSET('SQLNCLI', 'connection string', 'name of sp')
WHERE ...

Ini masih akan menjalankan seluruh SP setiap waktu, tentu saja.

5
MartW

Demi kesederhanaan dan untuk membuatnya kembali bisa dijalankan, saya telah menggunakan sistem StoredProcedure "sp_readerrorlog" untuk mendapatkan data:

-----USING Table Variable
DECLARE @tblVar TABLE (
   LogDate DATETIME,
   ProcessInfo NVARCHAR(MAX),
   [Text] NVARCHAR(MAX)
)
INSERT INTO @tblVar Exec sp_readerrorlog
SELECT LogDate as DateOccured, ProcessInfo as pInfo, [Text] as Message FROM @tblVar



-----(OR): Using Temp Table
IF OBJECT_ID('tempdb..#temp') IS NOT NULL  DROP TABLE #temp;
CREATE TABLE #temp (
   LogDate DATETIME,
   ProcessInfo NVARCHAR(55),
   Text NVARCHAR(MAX)
)
INSERT INTO #temp EXEC sp_readerrorlog
SELECT * FROM #temp
4
Sheikh Kawser

Sepertinya Anda hanya perlu menggunakan view . Tampilan memungkinkan kueri diwakili sebagai tabel sehingga, tampilan, dapat dipertanyakan.

2

Jika server Anda disebut SERVERX misalnya, ini adalah bagaimana saya melakukannya ...

EXEC sp_serveroption 'SERVERX', 'DATA ACCESS', TRUE;
DECLARE @CMD VARCHAR(1000);
DECLARE @StudentID CHAR(10);
SET @StudentID = 'STUDENT01';
SET @CMD = 'SELECT * FROM OPENQUERY([SERVERX], ''SET FMTONLY OFF; SET NOCOUNT ON; EXECUTE MYDATABASE.dbo.MYSTOREDPROC ' + @StudentID + ''') WHERE SOMEFIELD = SOMEVALUE';
EXEC (@CMD);

Untuk memeriksa ini berhasil, saya mengomentari baris perintah EXEC() dan menggantinya dengan SELECT @CMD untuk meninjau perintah sebelum mencoba menjalankannya! Itu untuk memastikan semua jumlah tanda kutip tunggal yang benar ada di tempat yang tepat. :-)

Saya harap itu membantu seseorang.

1
Fandango68