INSERT INTO @TABLE EXEC @query dengan SQL Server 2000

Benarkah SQL Server 2000, Anda tidak bisa memasukkan ke dalam variabel tabel menggunakan exec?

Saya mencoba skrip ini dan mendapat pesan kesalahan EXECUTE tidak dapat digunakan sebagai sumber ketika memasukkan ke dalam variabel tabel.

declare @tmp TABLE (code varchar(50), mount money)
DECLARE @q nvarchar(4000)
SET @q = 'SELECT coa_code, amount FROM T_Ledger_detail'

INSERT INTO  @tmp (code, mount)
EXEC sp_executesql (@q)

SELECT * from @tmp

Jika itu benar, apa yang harus saya lakukan?

Larutan

N.B. - pertanyaan dan jawaban ini berhubungan dengan SQL Server versi 2000. Pada versi yang lebih baru, pembatasan pada INSERT INTO @table_variable ... EXEC ... dicabut sehingga tidak berlaku untuk versi yang lebih baru.


Anda harus beralih ke tabel temp:

CREATE TABLE #tmp (code varchar(50), mount money)
DECLARE @q nvarchar(4000)
SET @q = 'SELECT coa_code, amount FROM T_Ledger_detail'

INSERT INTO  #tmp (code, mount)
EXEC sp_executesql (@q)

SELECT * from #tmp

Dari dokumentasi:

Variabel tabel berperilaku seperti variabel lokal. Ia memiliki ruang lingkup yang terdefinisi dengan baik, yaitu fungsi, prosedur tersimpan, atau batch di mana ia dideklarasikan.

Dalam ruang lingkupnya, variabel tabel dapat digunakan seperti tabel biasa. Ini dapat diterapkan di mana saja tabel atau ekspresi tabel digunakan dalam pernyataan SELECT, INSERT, UPDATE, dan DELETE. Namun, tabel tidak dapat digunakan dalam pernyataan-pernyataan berikut:

INSERT INTO table_variable EXEC stored_procedure

SELECT select_list INTO pernyataan table_variable.

Komentar (6)

Dokumentasinya menyesatkan.
Saya memiliki kode berikut yang berjalan dalam produksi

DECLARE @table TABLE (UserID varchar(100))
DECLARE @sql varchar(1000)
SET @sql = 'spSelUserIDList'
/* Will also work
   SET @sql = 'SELECT UserID FROM UserTable'
*/

INSERT INTO @table
EXEC(@sql)

SELECT * FROM @table
Komentar (0)
DECLARE @q nvarchar(4000)
SET @q = 'DECLARE @tmp TABLE (code VARCHAR(50), mount MONEY)
INSERT INTO @tmp
  (
    code,
    mount
  )
SELECT coa_code,
       amount
FROM   T_Ledger_detail

SELECT *
FROM   @tmp'

EXEC sp_executesql @q

Jika Anda ingin dalam kueri dinamis

Komentar (3)