it-swarm.com.de

INSERT INTO @TABLE EXEC @query mit SQL Server 2000

Stimmt es, dass Sie SQL Server 2000 nicht mit exec in eine Tabellenvariable einfügen können?

Ich habe dieses Skript ausprobiert und eine Fehlermeldung erhalten 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

Wenn das stimmt, was soll ich dann tun?

36
XMozart

NB. - Diese Frage und Antwort beziehen sich auf die 2000-Version von SQL Server. In späteren Versionen wurde die Einschränkung für INSERT INTO @table_variable ... EXEC ... wurden aufgehoben und gelten daher nicht für die späteren Versionen.


Sie müssen zu einer temporären Tabelle wechseln:

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. Es hat einen genau definierten Gültigkeitsbereich, dh die Funktion, gespeicherte Prozedur oder den Stapel, in dem es deklariert ist.

Innerhalb seines Gültigkeitsbereichs kann eine Tabellenvariable wie eine reguläre Tabelle verwendet werden. Es kann überall dort angewendet werden, wo eine Tabelle oder ein Tabellenausdruck in SELECT-, INSERT-, UPDATE- und DELETE-Anweisungen verwendet wird. In den folgenden Anweisungen darf die Tabelle jedoch nicht verwendet werden:

INSERT INTO table_variable EXEC stored_procedure

SELECT select_list INTO table_variable statements.

64

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

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
cob666
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 der dynamischen Abfrage möchten

6
brykneval