N.B. - esta pregunta y respuesta se relacionan con la versión 2000 de SQL Server. En versiones posteriores, la restricción de INSERT INTO @table_variable ... EXEC ...
fueron eliminados y, por lo tanto, no se aplica a esas versiones posteriores.
Tendrás 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, el procedimiento almacenado o el lote en el que se declara.
Dentro de su ámbito, una variable de tabla se puede utilizar como una tabla normal. Se puede aplicar en cualquier lugar donde se use una tabla o una expresión de tabla en las sentencias SELECT, INSERT, UPDATE y DELETE. Sin embargo, la tabla no se puede usar en las siguientes declaraciones:
INSERT INTO table_variable EXEC stored_procedure
SELECT select_list INTO table_variable statements.