Aku punya disimpan prosedur yang mengembalikan baris:
CREATE PROCEDURE MyProc
AS
BEGIN
SELECT * FROM MyTable
END
Saya sebenarnya prosedur ini sedikit lebih rumit, yang mengapa sproc diperlukan.
Apakah mungkin untuk memilih output dengan memanggil prosedur ini?
Sesuatu seperti:
SELECT * FROM (EXEC MyProc) AS TEMP
Saya perlu menggunakan PILIH TOP X
, ROW_NUMBER
, dan tambahan WHERE
untuk halaman data saya, dan saya don't benar-benar ingin lulus nilai-nilai ini sebagai parameter.
Anda dapat
... sql ....
Declare @T Table ([column definitions here])
Insert @T Exec storedProcname params
Select * from @T Where ...
Anda dapat menggunakan User-defined function atau view bukan prosedur.
Prosedur dapat kembali beberapa hasil set, masing-masing dengan skema. It's tidak cocok untuk digunakan dalam pernyataan PILIH
.
Anda harus membaca tentang OPENROWSET dan OPENQUERY
SELECT *
INTO #tmp FROM
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
Anda perlu mendeklarasikan tipe tabel yang berisi jumlah kolom yang sama anda menyimpan prosedur ini kembali. Tipe Data kolom pada tabel jenis dan kolom yang dikembalikan oleh prosedur harus sama
declare @MyTableType as table
(
FIRSTCOLUMN int
,.....
)
Kemudian anda perlu untuk memasukkan hasil dari prosedur yang tersimpan di tabel jenis anda hanya didefinisikan
Insert into @MyTableType
EXEC [dbo].[MyStoredProcedure]
Pada akhirnya hanya memilih dari tabel jenis
Select * from @MyTableType
Anda dapat menyalin output dari sp ke temporaty meja.
CREATE TABLE #GetVersionValues
(
[Index] int,
[Name] sysname,
Internal_value int,
Character_Value sysname
)
INSERT #GetVersionValues EXEC master.dbo.xp_msver 'WindowsVersion'
SELECT * FROM #GetVersionValues
drop TABLE #GetVersionValues
gunakan OPENQUERY dan sebelum Mengeksekusi set 'SET FMTONLY OFF; SET NOCOUNT ON;'
Mencoba ini contoh kode:
SELECT top(1)*
FROM
OPENQUERY( [Server], 'SET FMTONLY OFF; SET NOCOUNT ON; EXECUTE [database].[dbo].[storedprocedure] value,value ')
Cobalah mengubah prosedur untuk Inline Function yang mengembalikan sebuah tabel sebagai berikut:
CREATE FUNCTION MyProc()
RETURNS TABLE AS
RETURN (SELECT * FROM MyTable)
Dan kemudian anda dapat menyebutnya sebagai
SELECT * FROM MyProc()
Anda juga memiliki pilihan untuk melewati parameter untuk fungsi sebagai berikut:
CREATE FUNCTION FuncName (@para1 para1_type, @para2 para2_type , ... )
Dan panggilan itu
SELECT * FROM FuncName ( @para1 , @para2 )
Jika 'AKSES DATA' palsu,
EXEC sp_serveroption 'SQLSERVERNAME', 'DATA ACCESS', TRUE
setelah,
SELECT * FROM OPENQUERY(SQLSERVERNAME, 'EXEC DBNAME..MyProc @parameters')
ia bekerja.
Demi kesederhanaan dan untuk membuatnya kembali runnable, 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
Jika server anda adalah yang 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 bekerja, saya berkomentar keluar EXEC () baris perintah
dan menggantinya dengan SELECT @CMD
untuk review perintah sebelum mencoba untuk melaksanakannya! Itu untuk memastikan semua nomor yang benar dari single-quotes berada di tempat yang tepat. :-)
Saya berharap yang membantu seseorang.