Pertanyaan Masukkan hasil dari prosedur yang tersimpan ke dalam tabel sementara


Bagaimana saya melakukan SELECT * INTO [temp table] FROM [stored procedure]? Tidak FROM [Table] dan tanpa mendefinisikan [temp table]?

Select semua data dari BusinessLine ke tmpBusLine bekerja dengan baik.

select *
into tmpBusLine
from BusinessLine

Saya mencoba hal yang sama, tetapi menggunakan stored procedure yang mengembalikan data, tidak persis sama.

select *
into tmpBusLine
from
exec getBusinessLineHistory '16 Mar 2009'

Pesan output:

Msg 156, Level 15, Negara 1, Jalur 2   Sintaks yang salah di dekat kata kunci   'exec'.

Saya telah membaca beberapa contoh pembuatan tabel sementara dengan struktur yang sama dengan prosedur yang tersimpan, yang berfungsi dengan baik, tetapi akan menyenangkan untuk tidak menyediakan kolom apa pun.


1336
2018-03-17 10:45


asal


Jawaban:


Kamu dapat memakai OPENROWSET untuk ini. Coba lihat. Saya juga menyertakan kode sp_configure untuk mengaktifkan Ad Hoc Distributed Queries, jika belum diaktifkan.

CREATE PROC getBusinessLineHistory
AS
BEGIN
    SELECT * FROM sys.databases
END
GO

sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO

SELECT * INTO #MyTempTable FROM OPENROWSET('SQLNCLI', 'Server=(local)\SQL2008;Trusted_Connection=yes;',
     'EXEC getBusinessLineHistory')

SELECT * FROM #MyTempTable

619
2017-08-04 15:27



Jika Anda ingin melakukannya tanpa terlebih dahulu menyatakan tabel sementara, Anda bisa mencoba membuat fungsi yang ditentukan pengguna daripada a prosedur tersimpan dan membuat fungsi yang ditentukan pengguna mengembalikan tabel. Alternatifnya, jika Anda ingin menggunakan prosedur tersimpan, cobalah sesuatu seperti ini:

CREATE TABLE #tmpBus
(
   COL1 INT,
   COL2 INT
)

INSERT INTO #tmpBus
Exec SpGetRecords 'Params'

517
2018-03-17 14:08



Di SQL Server 2005 Anda dapat menggunakan INSERT INTO ... EXEC untuk memasukkan hasil dari prosedur yang tersimpan ke dalam tabel. Dari MSDN INSERT dokumentasi (untuk SQL Server 2000, sebenarnya):

--INSERT...EXECUTE procedure example
INSERT author_sales EXECUTE get_author_sales

267
2018-03-17 10:50



Ini adalah jawaban untuk versi pertanyaan Anda yang sedikit dimodifikasi. Jika Anda dapat mengabaikan penggunaan prosedur yang tersimpan untuk fungsi yang ditentukan pengguna, Anda dapat menggunakan fungsi yang ditentukan oleh pengguna inline meja. Ini pada dasarnya adalah prosedur tersimpan (akan mengambil parameter) yang mengembalikan tabel sebagai hasil yang ditetapkan; dan karena itu akan menempatkan baik dengan pernyataan INTO.

Ini bagus artikel cepat di atasnya dan fungsi lain yang ditentukan pengguna. Jika Anda masih memiliki kebutuhan mengemudi untuk prosedur yang tersimpan, Anda dapat membungkus fungsi yang ditentukan oleh pengguna dengan prosedur tersimpan. Prosedur yang tersimpan hanya melewatkan parameter ketika memanggil pilih * dari fungsi yang ditentukan oleh pengguna inline table-valued.

Jadi misalnya, Anda akan memiliki fungsi yang ditentukan pengguna untuk mendapatkan daftar pelanggan untuk wilayah tertentu:

CREATE FUNCTION CustomersByRegion 
(  
    @RegionID int  
)
RETURNS TABLE 
AS
RETURN 
  SELECT *
  FROM customers
  WHERE RegionID = @RegionID
GO

Anda kemudian dapat memanggil fungsi ini untuk mendapatkan hasil seperti itu:

SELECT * FROM CustomersbyRegion(1)

Atau untuk melakukan SELECT INTO:

SELECT * INTO CustList FROM CustomersbyRegion(1)

Jika Anda masih memerlukan prosedur yang tersimpan, kemudian bungkus fungsi seperti:

CREATE PROCEDURE uspCustomersByRegion 
(  
    @regionID int  
)
AS
BEGIN
     SELECT * FROM CustomersbyRegion(@regionID);
END
GO

Saya pikir ini adalah metode 'hack-less' yang paling banyak untuk mendapatkan hasil yang diinginkan. Ini menggunakan fitur yang ada karena dimaksudkan untuk digunakan tanpa komplikasi tambahan. Dengan menumpuk fungsi yang ditentukan pengguna dalam prosedur tersimpan dalam tabel, Anda memiliki akses ke fungsionalitas dalam dua cara. Plus! Anda hanya memiliki satu titik pemeliharaan untuk kode SQL yang sebenarnya.

Penggunaan OPENROWSET telah disarankan, tetapi ini bukan fungsi OPENROWSET yang dimaksudkan untuk digunakan (Dari Buku Online):

Termasuk semua informasi koneksi   yang diperlukan untuk mengakses data jarak jauh   dari sumber data OLE DB. Ini   metode adalah alternatif untuk mengakses   tabel di server yang terhubung dan merupakan a   satu kali, metode ad hoc untuk menghubungkan   dan mengakses data jarak jauh dengan menggunakan OLE   DB. Untuk referensi lebih sering   Sumber data OLE DB, gunakan tertaut   server sebagai gantinya.

Menggunakan OPENROWSET akan menyelesaikan pekerjaan, tetapi ini akan menambah biaya tambahan untuk membuka koneksi lokal dan menyusun data. Ini juga mungkin tidak menjadi pilihan dalam semua kasus karena memerlukan izin kueri ad hoc yang menimbulkan risiko keamanan dan karena itu mungkin tidak diinginkan. Juga, pendekatan OPENROWSET akan menghalangi penggunaan prosedur tersimpan yang mengembalikan lebih dari satu hasil yang ditetapkan. Membungkus beberapa fungsi nilai-didefinisikan inline tabel-nilai dalam satu prosedur yang tersimpan dapat mencapai ini.


166
2017-08-04 17:11



SELECT  *
INTO    #tmpTable
FROM    OPENQUERY(YOURSERVERNAME, 'EXEC test.dbo.prc_test 1')

100
2018-03-17 10:50



Solusi termudah:

CREATE TABLE #temp (...);

INSERT INTO #temp
EXEC [sproc];

Jika Anda tidak tahu skema maka Anda dapat melakukan hal berikut. Silahkan perhatikan bahwa ada risiko keamanan yang parah dalam metode ini.

SELECT * 
INTO #temp
FROM OPENROWSET('SQLNCLI', 
                'Server=localhost;Trusted_Connection=yes;', 
                'EXEC [db].[schema].[sproc]')

90
2018-03-13 19:38



Ketika prosedur tersimpan mengembalikan banyak kolom dan Anda tidak ingin secara manual "membuat" tabel sementara untuk menahan hasilnya, saya telah menemukan cara termudah adalah masuk ke prosedur tersimpan dan menambahkan "ke" klausa pada pilih pernyataan terakhir dan tambahkan 1 = 0 ke di mana klausa.

Jalankan prosedur yang tersimpan sekali dan kembali dan hapus kode SQL yang baru saja Anda tambahkan. Sekarang, Anda akan memiliki tabel kosong yang cocok dengan hasil prosedur yang tersimpan. Anda bisa "skrip meja sebagai buat" untuk tabel sementara atau hanya memasukkan langsung ke dalam tabel itu.


80
2018-03-17 14:06



declare @temp table
(
    name varchar(255),
    field varchar(255),
    filename varchar(255),
    filegroup varchar(255),
    size varchar(255),
    maxsize varchar(255),
    growth varchar(255),
    usage varchar(255)
);
INSERT @temp  Exec sp_helpfile;
select * from @temp;

60
2018-03-24 07:15



Apakah prosedur tersimpan Anda hanya mengambil data atau memodifikasinya juga? Jika hanya digunakan untuk mengambil, Anda dapat mengubah prosedur yang tersimpan menjadi fungsi dan menggunakan Ekspresi Tabel Biasa (CTEs) tanpa harus menyatakannya, sebagai berikut:

with temp as (
    select * from dbo.fnFunctionName(10, 20)
)
select col1, col2 from temp

Namun, apa pun yang perlu diambil dari CTE harus digunakan dalam satu pernyataan saja. Anda tidak bisa melakukan with temp as ... dan coba menggunakannya setelah beberapa baris SQL. Anda dapat memiliki banyak CTE dalam satu pernyataan untuk kueri yang lebih kompleks.

Sebagai contoh,

with temp1020 as (
    select id from dbo.fnFunctionName(10, 20)
),
temp2030 as (
    select id from dbo.fnFunctionName(20, 30)
)
select * from temp1020 
where id not in (select id from temp2030)

40
2017-08-06 07:28