INSERT INTO @TABLE EXEC @query mit SQL Server 2000

Stimmt es, dass man in SQL Server 2000 nicht mit exec in eine Tabellenvariable einfügen kann?

Ich habe dieses Skript ausprobiert und erhielt die Fehlermeldung "EXECUTE kann beim Einfügen in eine Tabellenvariable nicht als Quelle verwendet werden".

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

Wenn das stimmt, was soll ich dann tun?

Lösung

N.B. - diese Frage und Antwort beziehen sich auf die Version 2000 von SQL Server. In späteren Versionen wurde die Einschränkung für INSERT INTO @table_variable ... EXEC ... aufgehoben, so dass sie für diese späteren Versionen nicht mehr gilt.


Sie müssen auf eine temporäre Tabelle umsteigen:

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

Aus der Dokumentation:

Eine Tabellenvariable verhält sich wie eine lokale Variable. Sie hat einen genau definierten Bereich, nämlich die Funktion, gespeicherte Prozedur oder den Stapel, in dem sie deklariert ist.

Innerhalb ihres Bereichs kann eine Tabellenvariable wie eine normale Tabelle verwendet werden. Sie kann überall angewendet werden, wo eine Tabelle oder ein Tabellenausdruck in SELECT-, INSERT-, UPDATE- und DELETE-Anweisungen verwendet wird. Eine Tabelle darf jedoch nicht in den folgenden Anweisungen verwendet werden:

INSERT INTO table_variable EXEC stored_procedure

SELECT select_list INTO table_variable Anweisungen".

Kommentare (6)

Die Dokumentation ist irreführend.
Ich habe den folgenden Code in der Produktion laufen

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
Kommentare (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

Wenn Sie in einer dynamischen Abfrage

Kommentare (3)