Подтвердить что ты не робот

INSERT INTO @TABLE EXEC @query с SQL Server 2000

Верно ли, что SQL Server 2000 вы не можете вставить в переменную таблицы с помощью exec?

Я пробовал этот script и получил сообщение об ошибке 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

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

4b9b3361

Ответ 1

N.B. - этот вопрос и ответ относятся к версии SQL Server 2000 года. В более поздних версиях ограничение на 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.

Ответ 2

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

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

Ответ 3

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

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