INSERT INTO @TABLE EXEC @query в SQL Server 2000

Правда ли, что в SQL Server 2000 нельзя вставить в таблицу переменную с помощью exec?

Я попробовал этот сценарий и получил сообщение об ошибке EXECUTE нельзя использовать в качестве источника при вставке в табличную переменную.

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

Если это так, то что мне делать?

Комментарии к вопросу (3)
Решение

N.B. - этот вопрос и ответ относятся к 2000 версии SQL Server. В более поздних версиях ограничение на INSERT INTO @table_variable ... EXEC ... были сняты, поэтому данный вопрос не относится к более поздним версиям.


Вам придется перейти на временную таблицу:

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

Из документации:

Табличная переменная ведет себя как локальная переменная. Она имеет четко определенную область видимости, которой является функция, хранимая процедура или пакет, в котором она объявлена.

В пределах своей области видимости табличная переменная может использоваться как обычная таблица. Она может применяться везде, где таблица или табличное выражение используется в операторах SELECT, INSERT, UPDATE и DELETE. Однако таблица не может использоваться в следующих операторах:

INSERT INTO table_variable EXEC stored_procedure.

SELECT select_list INTO table_variable statements..

Комментарии (6)

Документация вводит в заблуждение.
У меня есть следующий код, работающий в продакшене

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
Комментарии (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

Если вы хотите в динамическом запросе

Комментарии (3)