Правда ли, что в 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
Если это так, то что мне делать?
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.
.
Документация вводит в заблуждение.
У меня есть следующий код, работающий в продакшене
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
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
Если вы хотите в динамическом запросе