INSERT INTO @TABLE EXEC @query con SQL Server 2000

¿Es cierto que en SQL Server 2000 no se puede insertar en una variable de tabla mediante exec?

Probé este script y me salió un mensaje de error EXECUTE no puede ser usado como fuente cuando se inserta en una variable de tabla.

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

Si eso es cierto, ¿qué debo hacer?

Solución

N.B. - esta pregunta y respuesta se refieren a la versión 2000 de SQL Server. En versiones posteriores, la restricción de INSERT INTO @table_variable ... EXEC ... fueron levantadas y por lo tanto no se aplica para esas versiones posteriores.


Tendrá que cambiar a una tabla temporal:

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

De la documentación:

Una variable de tabla se comporta como una variable local. Tiene un ámbito bien definido, que es la función, procedimiento almacenado o lote en el que se declara.

Dentro de su ámbito, una variable de tabla puede utilizarse como una tabla normal. Puede aplicarse en cualquier lugar donde se utilice una tabla o una expresión de tabla en las sentencias SELECT, INSERT, UPDATE y DELETE. Sin embargo, la tabla no puede utilizarse en las siguientes sentencias:

INSERT INTO tabla_variable EXEC procedimiento_almacenado

SELECT select_list INTO table_variable statements.

Comentarios (6)

La documentación es engañosa; Tengo el siguiente código ejecutándose en producción

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

Si quieres en consulta dinámica

Comentarios (3)