it-swarm.asia

Masukkan hasil dari prosedur tersimpan ke dalam tabel sementara

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

Select semua data dari BusinessLine menjadi tmpBusLine berfungsi 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 keluaran:

Msg 156, Level 15, Status 1, Baris 2 Sintaks salah di dekat kata kunci 'exec'.

Saya telah membaca beberapa contoh membuat tabel sementara dengan struktur yang sama dengan prosedur tersimpan keluaran, yang berfungsi dengan baik, tetapi akan lebih baik untuk tidak menyediakan kolom.

1456
Ferdeen

Anda dapat menggunakan OPENROWSET untuk ini. Silahkan lihat. Saya juga menyertakan kode sp_configure untuk mengaktifkan Kueri Terdistribusi Ad Hoc, 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
666
Aaron Alton

Jika Anda ingin melakukannya tanpa terlebih dahulu mendeklarasikan tabel sementara, Anda dapat mencoba membuat fungsi yang ditentukan pengguna daripada prosedur tersimpan dan membuat fungsi yang ditentukan pengguna mengembalikan tabel. Atau, jika Anda ingin menggunakan prosedur tersimpan, coba sesuatu seperti ini:

CREATE TABLE #tmpBus
(
   COL1 INT,
   COL2 INT
)

INSERT INTO #tmpBus
Exec SpGetRecords 'Params'
560
Gavin

Dalam SQL Server 2005 Anda bisa menggunakan INSERT INTO ... EXEC untuk menyisipkan hasil dari prosedur tersimpan ke dalam tabel. Dari dokumentasi INSERT MSDN (untuk SQL Server 2000, sebenarnya):

--INSERT...EXECUTE procedure example
INSERT author_sales EXECUTE get_author_sales
277
Matt Hamilton

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

Berikut ini adalah artikel cepat bagus di atasnya dan fungsi yang ditentukan pengguna lainnya. Jika Anda masih memiliki kebutuhan mengemudi untuk prosedur yang tersimpan, Anda dapat membungkus fungsi yang ditentukan pengguna dengan nilai tabel inline dengan prosedur tersimpan. Prosedur tersimpan hanya melewati parameter ketika ia memanggil pilih * dari fungsi yang ditentukan pengguna yang ditentukan tabel inline.

Jadi misalnya, Anda akan memiliki fungsi yang ditentukan pengguna dengan nilai tabel inline 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 apa:

SELECT * FROM CustomersbyRegion(1)

Atau untuk melakukan SELECT INTO:

SELECT * INTO CustList FROM CustomersbyRegion(1)

Jika Anda masih membutuhkan prosedur tersimpan, maka bungkus fungsinya seperti ini:

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

Saya pikir ini adalah metode paling 'hack-less' untuk mendapatkan hasil yang diinginkan. Ini menggunakan fitur yang ada karena mereka dimaksudkan untuk digunakan tanpa komplikasi tambahan. Dengan bersarang fungsi yang ditentukan pengguna yang dinilai tabel inline dalam prosedur tersimpan, 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 tujuan dari fungsi OPENROWSET untuk digunakan (Dari Buku Daring):

Termasuk semua informasi koneksi yang diperlukan untuk mengakses data jarak jauh dari OLE sumber data DB. Metode ini merupakan alternatif untuk mengakses tabel di server yang ditautkan dan merupakan metode ad-hoc satu kali untuk menghubungkan dan mengakses data jarak jauh dengan menggunakan OLE DB. Untuk referensi yang lebih sering ke OLE sumber data DB, gunakan server yang ditautkan.

Menggunakan OPENROWSET akan menyelesaikan pekerjaan, tetapi akan dikenakan biaya tambahan untuk membuka koneksi lokal dan membuat data. Ini juga mungkin bukan opsi dalam semua kasus karena memerlukan izin permintaan ad hoc yang menimbulkan risiko keamanan dan karenanya mungkin tidak diinginkan. Juga, pendekatan OPENROWSET akan menghalangi penggunaan prosedur tersimpan yang mengembalikan lebih dari satu set hasil. Membungkus beberapa inline table-nilai fungsi yang ditentukan pengguna dalam satu prosedur tersimpan dapat mencapai ini.

182
Christian Loris
EXEC sp_serveroption 'YOURSERVERNAME', 'DATA ACCESS', TRUE

SELECT  *
INTO    #tmpTable
FROM    OPENQUERY(YOURSERVERNAME, 'EXEC db.schema.sproc 1')
117
Quassnoi

Solusi termudah:

CREATE TABLE #temp (...);

INSERT INTO #temp
EXEC [sproc];

Jika Anda tidak mengetahui skema tersebut maka Anda dapat melakukan hal berikut. Harap dicatat bahwa ada risiko keamanan yang parah dalam metode ini.

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

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

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

95
dotjoe
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;
62
nitin

Jika tabel hasil proc yang disimpan terlalu rumit untuk mengetikkan pernyataan "buat tabel" dengan tangan, dan Anda tidak dapat menggunakan OPENQUERY OR OPENROWSET, Anda dapat menggunakan sp_help untuk menghasilkan daftar kolom dan tipe data untuk Anda. Setelah Anda memiliki daftar kolom, tinggal memformatnya sesuai dengan kebutuhan Anda.

Langkah 1: Tambahkan "ke #temp" ke kueri output (mis. "Pilih [...] ke #temp dari [...]").

Cara termudah adalah mengedit kueri keluaran di proc secara langsung. jika Anda tidak dapat mengubah proc yang disimpan, Anda dapat menyalin konten ke jendela kueri baru dan memodifikasi kueri di sana.

Langkah 2: Jalankan sp_help di tabel temp. (mis. "exec tempdb..sp_help #temp")

Setelah membuat tabel temp, jalankan sp_help di tabel temp untuk mendapatkan daftar kolom dan tipe data termasuk ukuran bidang varchar.

Langkah 3: Salin kolom & jenis data ke dalam pernyataan tabel buat

Saya memiliki lembar Excel yang saya gunakan untuk memformat output sp_help menjadi pernyataan "buat tabel". Anda tidak perlu sesuatu yang mewah, cukup salin dan tempel ke editor SQL Anda. Gunakan nama kolom, ukuran, dan jenis untuk membangun pernyataan "Buat tabel #x [...]" atau "nyatakan @x tabel [...]" yang dapat Anda gunakan untuk menyisipkan hasil dari prosedur tersimpan.

Langkah 4: Masukkan ke dalam tabel yang baru dibuat

Sekarang Anda akan memiliki kueri yang seperti solusi lain yang dijelaskan di utas ini.

DECLARE @t TABLE 
(
   --these columns were copied from sp_help
   COL1 INT,
   COL2 INT   
)

INSERT INTO @t 
Exec spMyProc 

Teknik ini juga dapat digunakan untuk mengonversi tabel temp (#temp) menjadi variabel tabel (@temp). Meskipun ini mungkin langkah lebih dari sekadar menulis sendiri create table statement, itu mencegah kesalahan manual seperti kesalahan ketik dan tipe data yang tidak cocok dalam proses besar. Mendebug kesalahan ketik bisa memakan waktu lebih lama daripada menulis kueri.

44
FistOfFury

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 Common Table Expressions (CTEs) tanpa harus mendeklarasikannya, 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 dapat melakukan with temp as ... dan mencoba menggunakannya setelah beberapa baris SQL. Anda dapat memiliki beberapa 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)
44
Rashmi Pandit

Quassnoi menempatkan saya hampir di sana, tetapi ada satu hal yang hilang:

**** Saya perlu menggunakan parameter dalam prosedur tersimpan. ****

Dan OPENQUERY tidak mengizinkan ini terjadi:

Jadi saya menemukan cara untuk bekerja sistem dan juga tidak harus membuat definisi tabel begitu kaku, dan mendefinisikannya kembali di dalam prosedur lain yang tersimpan (dan tentu saja mengambil kesempatan itu mungkin rusak)!

Ya, Anda dapat secara dinamis membuat definisi tabel yang dikembalikan dari prosedur tersimpan dengan menggunakan pernyataan OPENQUERY dengan variabel palsu (selama NO SET HASIL mengembalikan jumlah bidang yang sama dan dalam posisi yang sama dengan dataset dengan data yang baik).

Setelah tabel dibuat, Anda dapat menggunakan prosedur tersimpan exec ke dalam tabel sementara sepanjang hari.


Dan untuk dicatat (seperti yang ditunjukkan di atas) Anda harus mengaktifkan akses data,

EXEC sp_serveroption 'MYSERVERNAME', 'DATA ACCESS', TRUE

Kode:

declare @locCompanyId varchar(8)
declare @locDateOne datetime
declare @locDateTwo datetime

set @locDateOne = '2/11/2010'
set @locDateTwo = getdate()

--Build temporary table (based on bogus variable values)
--because we just want the table definition and
--since openquery does not allow variable definitions...
--I am going to use bogus variables to get the table defintion.

select * into #tempCoAttendanceRpt20100211
FROM OPENQUERY(DBASESERVER,
  'EXEC DATABASE.dbo.Proc_MyStoredProc 1,"2/1/2010","2/15/2010 3:00 pm"')

set @locCompanyId = '7753231'

insert into #tempCoAttendanceRpt20100211
EXEC DATABASE.dbo.Proc_MyStoredProc @locCompanyId,@locDateOne,@locDateTwo

set @locCompanyId = '9872231'

insert into #tempCoAttendanceRpt20100211
EXEC DATABASE.dbo.Proc_MyStoredProc @locCompanyId,@locDateOne,@locDateTwo

select * from #tempCoAttendanceRpt20100211
drop table #tempCoAttendanceRpt20100211

Terima kasih atas informasi yang diberikan semula ... Ya, akhirnya saya tidak harus membuat semua definisi palsu ini (ketat) tabel saat menggunakan data dari prosedur tersimpan lain atau database, dan ya Anda dapat menggunakan parameter juga.

Cari tag referensi:

  • SQL 2005 menyimpan prosedur ke dalam tabel temp

  • openquery dengan prosedur tersimpan dan variabel 2005

  • openquery dengan variabel

  • jalankan prosedur tersimpan ke dalam tabel temp

Pembaruan: ini tidak akan berfungsi dengan tabel sementara jadi saya harus menggunakan secara manual membuat tabel sementara.

Pemberitahuan Nyebelin : ini tidak akan bekerja dengan tabel sementara , http://www.sommarskog.se/share_data.html#OPENQUERY

Referensi: Hal berikutnya adalah mendefinisikan LOCALSERVER. Ini mungkin terlihat seperti kata kunci dalam contoh, tetapi sebenarnya hanya sebuah nama. Inilah cara Anda melakukannya:

sp_addlinkedserver @server = 'LOCALSERVER',  @srvproduct = '',
                   @provider = 'SQLOLEDB', @datasrc = @@servername

Untuk membuat server tertaut, Anda harus memiliki izin ALTER ANY SERVER, atau menjadi anggota dari salah satu peran server tetap sysadmin atau setupadmin.

OPENQUERY membuka koneksi baru ke SQL Server. Ini memiliki beberapa implikasi:

Prosedur yang Anda panggil dengan OPENQUERY tidak dapat merujuk tabel sementara yang dibuat dalam koneksi saat ini.

Koneksi baru memiliki database default sendiri (didefinisikan dengan sp_addlinkedserver, default adalah master), jadi semua spesifikasi objek harus menyertakan nama database.

Jika Anda memiliki transaksi terbuka dan menahan kunci saat Anda menelepon OPENQUERY, prosedur yang dipanggil tidak dapat mengakses apa yang Anda kunci. Artinya, jika Anda tidak hati-hati Anda akan memblokir diri sendiri.

Menghubungkan tidak gratis, jadi ada penalti kinerja.

Jika OPENROWSET menyebabkan Anda mengalami masalah, ada cara lain mulai 2012 dan seterusnya; memanfaatkan sys.dm_exec_describe_first_result_set_for_object, seperti yang disebutkan di sini: Ambil nama kolom dan jenis prosedur tersimpan?

Pertama, buat prosedur tersimpan ini untuk menghasilkan SQL untuk sementara

CREATE PROCEDURE dbo.usp_GetStoredProcTableDefinition(
    @ProcedureName  nvarchar(128),
    @TableName      nvarchar(128),
    @SQL            nvarchar(max) OUTPUT
)
AS
SET @SQL = 'CREATE TABLE ' + @tableName + ' ('

SELECT @SQL = @SQL + '['+name +'] '+ system_type_name +''  + ','
        FROM sys.dm_exec_describe_first_result_set_for_object
        (
          OBJECT_ID(@ProcedureName), 
          NULL
        );

--Remove trailing comma
SET @SQL = SUBSTRING(@SQL,0,LEN(@SQL))    
SET @SQL =  @SQL +')'

Untuk menggunakan prosedur, panggil dengan cara berikut:

DECLARE     @SQL    NVARCHAR(MAX)

exec dbo.usp_GetStoredProcTableDefinition
    @ProcedureName='dbo.usp_YourProcedure',
    @TableName='##YourGlobalTempTable',@SQL = @SQL OUTPUT

INSERT INTO ##YourGlobalTempTable
EXEC    [dbo].usp_YourProcedure

select * from ##YourGlobalTempTable

Perhatikan bahwa saya menggunakan tabel sementara global. Itu karena menggunakan EXEC untuk menjalankan SQL dinamis membuat sesi sendiri, sehingga tabel sementara biasa akan berada di luar jangkauan ke kode berikutnya. Jika tabel sementara global adalah masalah, Anda bisa menggunakan tabel sementara biasa, tetapi setiap SQL berikutnya harus dinamis, yaitu, juga dieksekusi oleh pernyataan EXEC.

25
StuartQ

Proc yang tersimpan ini berfungsi:

CREATE PROCEDURE [dbo].[ExecIntoTable]
(
    @tableName          NVARCHAR(256),
    @storedProcWithParameters   NVARCHAR(MAX)
)
AS
BEGIN
    DECLARE @driver         VARCHAR(10)
    DECLARE @connectionString   NVARCHAR(600)
    DECLARE @sql            NVARCHAR(MAX)
    DECLARE @rowsetSql      NVARCHAR(MAX)

    SET @driver = '''SQLNCLI'''

    SET @connectionString = 
        '''server=' + 
            CAST(SERVERPROPERTY('ServerName') AS NVARCHAR(256)) + 
            COALESCE('\' + CAST(SERVERPROPERTY('InstanceName') AS NVARCHAR(256)), '') + 
        ';trusted_connection=yes'''

    SET @rowsetSql = '''EXEC ' + REPLACE(@storedProcWithParameters, '''', '''''') + ''''

    SET @sql = '
SELECT
    *
INTO 
    ' + @tableName + ' 
FROM
    OPENROWSET(' + @driver + ',' + @connectionString + ',' + @rowsetSql + ')'

    EXEC (@sql)
END
GO

Ini sedikit pengerjaan ulang ini: Masukkan hasil prosedur tersimpan ke dalam tabel sehingga benar-benar berfungsi.

Jika Anda ingin itu bekerja dengan tabel sementara maka Anda harus menggunakan tabel ##GLOBAL dan menjatuhkannya sesudahnya.

20
briantyler

Jika Anda cukup beruntung memiliki SQL 2012 atau lebih tinggi, Anda dapat menggunakan dm_exec_describe_first_result_set_for_object

Saya baru saja mengedit sql yang disediakan oleh gotqn. Terima kasih, terima kasih.

Ini menciptakan tabel temp global dengan nama yang sama dengan nama prosedur. Tabel temp nantinya dapat digunakan sesuai kebutuhan. Hanya saja, jangan lupa untuk menjatuhkannya sebelum menjalankan ulang.

    declare @procname nvarchar(255) = 'myProcedure',
            @sql nvarchar(max) 

    set @sql = 'create table ##' + @procname + ' ('
    begin
            select      @sql = @sql + '[' + r.name + '] ' +  r.system_type_name + ','
            from        sys.procedures AS p
            cross apply sys.dm_exec_describe_first_result_set_for_object(p.object_id, 0) AS r
            where       p.name = @procname

            set @sql = substring(@sql,1,len(@sql)-1) + ')'
            execute (@sql)
            execute('insert ##' + @procname + ' exec ' + @procname)
    end
17
Sandeep Gaadhe
  1. Saya membuat tabel dengan skema dan data berikut.
  2. Buat prosedur tersimpan.
  3. Sekarang saya tahu apa hasil dari prosedur saya, jadi saya melakukan permintaan berikut.

    CREATE TABLE [dbo].[tblTestingTree](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [ParentId] [int] NULL,
        [IsLeft] [bit] NULL,
        [IsRight] [bit] NULL,
    CONSTRAINT [PK_tblTestingTree] PRIMARY KEY CLUSTERED
    (
        [Id] ASC
    ) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    SET IDENTITY_INSERT [dbo].[tblTestingTree] ON
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (1, NULL, NULL, NULL)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (2, 1, 1, NULL)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (3, 1, NULL, 1)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (4, 2, 1, NULL)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (5, 2, NULL, 1)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (6, 3, 1, NULL)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (7, 3, NULL, 1)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (8, 4, 1, NULL)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (9, 4, NULL, 1)
    INSERT [dbo].[tblTestingTree] ([Id], [ParentId], [IsLeft], [IsRight]) VALUES (10, 5, 1, NULL)
    
    SET IDENTITY_INSERT [dbo].[tblTestingTree] OFF
    

    NILAI (10, 5, 1, NULL) SET IDENTITY_INSERT [dbo]. [TblTestingTree] Aktif

    create procedure GetDate
    as
    begin
        select Id,ParentId from tblTestingTree
    end
    
    create table tbltemp
    (
        id int,
        ParentId int
    )
    insert into tbltemp
    exec GetDate
    
    select * from tbltemp;
    
15
Devansh

Untuk memasukkan set rekaman pertama dari prosedur tersimpan ke dalam tabel sementara Anda harus mengetahui yang berikut:

  1. hanya set baris pertama dari prosedur tersimpan yang dapat dimasukkan ke dalam tabel sementara
  2. prosedur tersimpan tidak boleh menjalankan pernyataan T-SQL dinamis (sp_executesql)
  3. anda perlu menentukan struktur tabel sementara terlebih dahulu

Di atas mungkin terlihat sebagai batasan, tetapi IMHO itu masuk akal - jika Anda menggunakan sp_executesql Anda dapat sekali mengembalikan dua kolom dan sekali sepuluh, dan jika Anda memiliki beberapa set hasil, Anda tidak dapat memasukkannya ke dalam beberapa tabel juga - Anda dapat memasukkan maksimum dalam dua tabel dalam satu pernyataan T-SQL (menggunakan klausa OUTPUT dan tidak ada pemicu).

Jadi, masalah utamanya adalah bagaimana mendefinisikan struktur tabel sementara sebelum melakukan pernyataan EXEC ... INTO ....

Yang pertama bekerja dengan OBJECT_ID sedangkan yang kedua dan ketiga bekerja dengan permintaan Ad-hoc juga. Saya lebih suka menggunakan DMV daripada sp karena Anda dapat menggunakan CROSS APPLY dan membangun definisi tabel sementara untuk beberapa prosedur pada saat yang sama.

SELECT p.name, r.* 
FROM sys.procedures AS p
CROSS APPLY sys.dm_exec_describe_first_result_set_for_object(p.object_id, 0) AS r;

Juga, perhatikan bidang system_type_name karena ini bisa sangat berguna. Ini menyimpan definisi lengkap kolom. Sebagai contoh:

smalldatetime
nvarchar(max)
uniqueidentifier
nvarchar(1000)
real
smalldatetime
decimal(18,2)

dan Anda dapat menggunakannya secara langsung di sebagian besar kasus untuk membuat definisi tabel.

Jadi, saya pikir dalam sebagian besar kasus (jika prosedur tersimpan sesuai dengan kriteria tertentu), Anda dapat dengan mudah membuat pernyataan dinamis untuk menyelesaikan masalah tersebut (buat tabel sementara, masukkan hasil prosedur tersimpan di dalamnya, lakukan apa yang Anda perlukan dengan data) .


Perhatikan, bahwa objek di atas gagal untuk menentukan data set hasil pertama dalam beberapa kasus seperti ketika pernyataan T-SQL dinamis dieksekusi atau tabel sementara digunakan dalam prosedur tersimpan.

14
gotqn

Jika kueri tidak mengandung parameter, gunakan OpenQuery lain gunakan OpenRowset.

Hal dasar adalah membuat skema sesuai prosedur yang tersimpan dan memasukkan ke dalam tabel itu. misalnya.:

DECLARE @abc TABLE(
                  RequisitionTypeSourceTypeID INT
                , RequisitionTypeID INT
                , RequisitionSourcingTypeID INT
                , AutoDistOverride INT
                , AllowManagerToWithdrawDistributedReq INT
                , ResumeRequired INT
                , WarnSupplierOnDNRReqSubmission  INT
                , MSPApprovalReqd INT
                , EnableMSPSupplierCounterOffer INT
                , RequireVendorToAcceptOffer INT
                , UseCertification INT
                , UseCompetency INT
                , RequireRequisitionTemplate INT
                , CreatedByID INT
                , CreatedDate DATE
                , ModifiedByID INT
                , ModifiedDate DATE
                , UseCandidateScheduledHours INT
                , WeekEndingDayOfWeekID INT
                , AllowAutoEnroll INT
                )
INSERT INTO @abc
EXEC [dbo].[usp_MySp] 726,3
SELECT * FROM @abc
12
ProblemSolver

Kode

CREATE TABLE #T1
(
    col1 INT NOT NULL,
    col2 NCHAR(50) NOT NULL,
    col3 TEXT NOT NULL,
    col4 DATETIME NULL,
    col5 NCHAR(50) NULL,
    col6 CHAR(2) NULL,
    col6 NCHAR(100) NULL,
    col7 INT NULL,
    col8 NCHAR(50) NULL,
    col9 DATETIME NULL,
    col10 DATETIME NULL
)

DECLARE @Para1 int
DECLARE @Para2 varchar(32)
DECLARE @Para3 varchar(100)
DECLARE @Para4 varchar(15)
DECLARE @Para5 varchar (12)
DECLARE @Para6 varchar(1)
DECLARE @Para7 varchar(1)


SET @Para1 = 1025
SET @Para2 = N'6as54fsd56f46sd4f65sd'
SET @Para3 = N'XXXX\UserName'
SET @Para4 = N'127.0.0.1'
SET @Para5 = N'XXXXXXX'
SET @Para6 = N'X'
SET @Para7 = N'X'

INSERT INTO #T1
(
    col1,
    col2,
    col3,
    col4,
    col5,
    col6,
    col6,
    col7,
    col8,
    col9,
    col10,
)
EXEC [dbo].[usp_ProcedureName] @Para1, @Para2, @Para3, @Para4, @Para5, @Para6, @Para6

Saya harap ini membantu. Harap memenuhi syarat yang sesuai.

10
SoftwareARM

Saya menemukan Passing Arrays/DataTables ke Stored Procedures yang mungkin memberi Anda ide lain tentang bagaimana Anda bisa menyelesaikan masalah Anda.

Tautan menyarankan untuk menggunakan parameter Image type untuk masuk ke prosedur tersimpan. Kemudian dalam prosedur tersimpan, gambar diubah menjadi variabel tabel yang berisi data asli.

Mungkin ada cara ini bisa digunakan dengan tabel sementara.

10
kevchadders

Saya menemui masalah yang sama dan inilah yang saya lakukan untuk ini dari saran Paul . Bagian utama di sini adalah menggunakan NEWID() untuk menghindari beberapa pengguna menjalankan prosedur/skrip store pada saat yang sama, rasa sakit untuk tabel sementara global.

DECLARE @sql varchar(max) = '', 
@tmp_global_table varchar(255) = '##global_tmp_' + CONVERT(varchar(36), NEWID())
SET @sql = @sql + 'select * into [' + @tmp_global_table + '] from YOURTABLE'
EXEC(@sql)

EXEC('SELECT * FROM [' + @tmp_global_table + ']')
9
zhongxiao37

Metode lain adalah membuat tipe dan menggunakan PIPELINED untuk kemudian mengirimkan kembali objek Anda. Namun ini terbatas untuk mengetahui kolom. Tetapi ia memiliki keuntungan untuk bisa melakukan:

SELECT * 
FROM TABLE(CAST(f$my_functions('8028767') AS my_tab_type))
8
pierre

Jika Anda tahu parameter yang dilewati dan jika Anda tidak memiliki akses untuk membuat sp_configure, kemudian edit prosedur tersimpan dengan parameter ini dan hal yang sama dapat disimpan dalam tabel global ##.

3
lakshmivisalij

Ini adalah proses 2 langkah sederhana: - membuat tabel sementara - Masukkan ke dalam tabel sementara.

Kode untuk melakukan hal yang sama:

CREATE TABLE #tempTable (Column1 int, Column2 varchar(max));
INSERT INTO #tempTable 
EXEC [app].[Sproc_name]
@param1 = 1,
@param2 =2;
0
S Krishna

Yah, Anda harus membuat tabel temp, tetapi tidak harus memiliki skema yang tepat .... Saya telah membuat prosedur tersimpan yang memodifikasi tabel temp yang ada sehingga memiliki kolom yang diperlukan dengan data yang benar jenis dan pesanan (menjatuhkan semua kolom yang ada, menambahkan kolom baru):

GO
create procedure #TempTableForSP(@tableId int, @procedureId int)  
as   
begin  
    declare @tableName varchar(max) =  (select name  
                                        from tempdb.sys.tables 
                                        where object_id = @tableId
                                        );    
    declare @tsql nvarchar(max);    
    declare @tempId nvarchar(max) = newid();      
    set @tsql = '    
    declare @drop nvarchar(max) = (select  ''alter table tempdb.dbo.' + @tableName 
            +  ' drop column ''  + quotename(c.name) + '';''+ char(10)  
                                   from tempdb.sys.columns c   
                                   where c.object_id =  ' + 
                                         cast(@tableId as varchar(max)) + '  
                                   for xml path('''')  
                                  )    
    alter table tempdb.dbo.' + @tableName + ' add ' + QUOTENAME(@tempId) + ' int;
    exec sp_executeSQL @drop;    
    declare @add nvarchar(max) = (    
                                select ''alter table ' + @tableName 
                                      + ' add '' + name 
                                      + '' '' + system_type_name 
                           + case when d.is_nullable=1 then '' null '' else '''' end 
                                      + char(10)   
                              from sys.dm_exec_describe_first_result_set_for_object(' 
                               + cast(@procedureId as varchar(max)) + ', 0) d  
                                order by column_ordinal  
                                for xml path(''''))    

    execute sp_executeSQL  @add;    
    alter table '  + @tableName + ' drop column ' + quotename(@tempId) + '  ';      
    execute sp_executeSQL @tsql;  
end         
GO

create table #exampleTable (pk int);

declare @tableId int = object_Id('tempdb..#exampleTable')
declare @procedureId int = object_id('examplestoredProcedure')

exec #TempTableForSP @tableId, @procedureId;

insert into #exampleTable
exec examplestoredProcedure

Catatan ini tidak akan berfungsi jika sys.dm_exec_describe_first_result_set_for_object tidak dapat menentukan hasil prosedur tersimpan (misalnya jika menggunakan tabel temp).

0
jmoreno