INSERT INTO @ TABLE EXEC @query with SQL Server 2000

Czy to prawda, że SQL Server 2000, nie można wstawić do zmiennej tabeli za pomocą exec?

Wypróbowałem ten skrypt i dostałem komunikat o błędzie EXECUTE cannot be used as a source when inserting into a table variable.

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
Jeśli to prawda, to co mam zrobić?
Author: Factor Mystic, 2013-01-31

3 answers

N. B. - to pytanie i odpowiedź odnoszą się do wersji 2000 SQL Server. W późniejszych wersjach ograniczenie INSERT INTO @table_variable ... EXEC ... zostało zniesione, więc nie dotyczy ono tych późniejszych wersji.


Będziesz musiał przełączyć się na 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

Z dokumentacji :

Zmienna tabelkowa zachowuje się jak zmienna lokalna. Ma dobrze zdefiniowany zakres, czyli funkcję, procedurę składowaną lub partię, w której jest deklarowana.

Wewnątrz jego zakres, zmienna table może być używana jak zwykła tabela. Może być stosowany wszędzie tam, gdzie wyrażenia tabeli lub tabeli są używane w instrukcjach SELECT, INSERT, UPDATE i DELETE. Jednakże tabela nie może być używana w następujących instrukcjach:

INSERT INTO table_variable EXEC stored_procedure

SELECT select_list INTO table_variable statements.

 69
Author: Damien_The_Unbeliever,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Dokumentacja wprowadza w błąd.
Mam następujący kod uruchomiony w produkcji

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
 9
Author: cob666,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-11 21:04:04
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

Jeśli chcesz w dynamicznym zapytaniu

 5
Author: Sandip Bantawa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-31 10:22:29