Питання INSERT INTO @TABLE EXEC @query з SQL Server 2000


Це правда, що SQL Server 2000, ви не можете вставити в змінну таблиці, використовуючи exec?

Я спробував цей сценарій і отримав повідомлення про помилку 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

Якщо це правда, що я повинен робити?


33
2018-01-31 09:56


походження


Якщо це правда, ви повинні CREATE TEMP TABLE (Я впевнений, що ви можете вставити в таблицю temp з EXEC). - Anton Kovalenko
"Це правда?" - так - "Однак таблиця не може використовуватися в наступних твердженнях: INSERT INTO table_variable EXEC stored_procedure" - Damien_The_Unbeliever
Гаразд, я отримав це, це як @ Антон Коваленко сказав: "Мені потрібно створити тимчасовий стіл, а не змінна таблиці ... Thx. :) - XMozart


Відповіді:


Н.Б. - це питання та відповідь стосуються версії 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.


58
2018-01-31 10:13



@Damien, у вашому прикладі немає причин використовувати таблицю Temp, ви все ще можете використовувати змінні таблиці навіть у своєму прикладі. - GoldBishop
Перевірте, що ви можете використовувати @tableVariables у 2008+ - ohmusama
@ohmusama - так, але питання позначено 2000 і я зв'язався з документацією 2000 року, заявивши, що вона недоступна. - Damien_The_Unbeliever
@Damien_The_Unbeliever, я знаю, але так як Google не може це зрозуміти, тому що я приїхав сюди звідти, це коментар для інших людей, таких як я. - ohmusama
@ohmusama - добре, я додав у верхній частині нотатки (намагайся) чітко зрозуміти, що це питання і відповідь стосуються лише версії продукту 2000 року. - Damien_The_Unbeliever


Документація є оманливою.
Я виконую наступний код у виробництві

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

9
2018-03-30 16:29





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

Якщо ви хочете в динамічному запиті


5
2018-01-31 10:06



так, я хочу, щоб значення було з динамічного сценарію .. і я думаю, що це не динамічно .. - XMozart
Тож над запитом вам допоможе - brykneval
Так, це статичне виконання. Для того, щоб це було динамічно, потрібно мати зв'язки в межах присвоєння @q змінна Хороша спроба, але не костей. - GoldBishop