Динамическая вставка в таблицу переменных оператора SQL Server - PullRequest
6 голосов
/ 04 марта 2011

У меня есть таблица переменных:

DECLARE @A_Table TABLE(ID INT, att1 VARCHAR(100), att2 nvarchar(200))

Я хочу создать динамический sql, поэтому я вставляю в эту таблицу некоторые данные (все внутри цикла):

WHILE (@i <= 100) BEGIN         
  SELECT @other_att  = NAME  FROM @other_Table where ID =  @i;
  SET @sql = 'INSERT ' + @A_Table+ '(ID,att1,att2) SELECT '+CAST(@i AS VARCHAR)+' , '''+ @other_att+''', SUM('+ @other_att') FROM '+ @EVEN_OTHER_Table;
EXEC (@sql);

END 

sqlкаждый раз будет выглядеть так:

INSERT INTO @A_Table SELECT 1 , 'subject', SUM(subject)
INSERT INTO @A_Table SELECT 2 , 'age', SUM(age)
INSERT INTO @A_Table SELECT 3 , 'sex', SUM(sex).... 

И после выполнения этого: SO я получу:

@A_Table:
id    att1   att2
1   subject   4.3
2   age       4.5
3   sex       4.1

, но получаю ошибку:

Msg 137, Level 16, State 1, Line 48
Must declare the scalar variable "@A_Table".

SOчто такое синтаксис для динамической вставки в таблицу переменных?

Хорошо, я понял это.

Ответы [ 4 ]

10 голосов
/ 04 марта 2011

Вы можете использовать синтаксис INSERT ... EXEC для вставки данных, возвращаемых динамическим SELECT.Конечно, вам нужно будет удалить часть INSERT из динамического оператора.

WHILE (@i <= 100) BEGIN         
  SELECT @other_att  = NAME  FROM @other_Table where ID =  @i;
  SET @sql = 'SELECT '+CAST(@i AS VARCHAR)+' , ''' + @other_att+''', SUM('+ @other_att + ') FROM '+ @EVEN_OTHER_Table;
  <b>INSERT INTO @A_Table (ID,att1,att2)
    EXEC (@sql)</b>;
END
5 голосов
/ 04 марта 2011

У вас есть переменная таблицы, а не переменная, которая содержит имя таблицы.

Так что вам понадобится следующее.

WHILE (@i <= 100) BEGIN         
  SELECT @other_att  = NAME  FROM @other_Table where ID =  @i;
  SET @sql = 'INSERT INTO @A_Table (ID,att1,att2) SELECT '+CAST(@i AS VARCHAR)+' , '''+ @other_att+''', SUM('+ @other_att') FROM @EVEN_OTHER_Table';
EXEC (@sql);

END 

Вам также необходимо объявить переменную таблицы как оператор внутри переменной @sql и выполнить таблицу объявлений и вставки вместе или использовать локальную / глобальную временную таблицу.

С локальной временной таблицей (хранящейся в базе данных tempdb) вы можете сделать что-то подобное.

CREATE TABLE #testtbl (ID INT);
EXEC ('INSERT INTO #testtbl VALUES (1)');
SELECT * FROM #testtbl
DROP TABLE #testtbl

Полезная информация о временных таблицах в BOL

http://msdn.microsoft.com/en-us/library/ms174979.aspx - довольно далеко вниз по странице

И тип table.

http://msdn.microsoft.com/en-us/library/ms175010.aspx

3 голосов
/ 04 марта 2011

Ваш оператор EXEC встречается в другом контексте и поэтому не знает ни о каких переменных, созданных в исходном контексте.

0 голосов
/ 26 ноября 2017

Создать динамический запрос вставки - это действительно задача, я тоже изо всех сил пытаюсь ее найти, наконец, я попытался следующим образом, и она успешно работает.Пожалуйста, найдите код ниже.

CREATE PROCEDURE [dbo].[InsertTodaysData] (@tbl varchar(50),@Days int,
 @MDate varchar(50), @EValue varchar(50), @Speed varchar(50),
@Totalreturn varchar(50),@Closingv varchar(50), @TotalReturnV varchar(50))

AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @SQLQuery varchar(2000)
-- Insert statements for procedure here
set @SQLQuery = 'INSERT INTO '+@tbl+' (ID,MDate,EValue,Speed,TotalReturnRatio,ClosingValue,
TotalReturnValue) VALUES ('+@Days+','''+@MDate+''', '+@EValue+', '+@Speed+',
 '+@Totalreturn+', '+@Closingv+', '+@TotalReturnV+')'

EXECUTE(@SQLQuery)

END

Надеюсь, это поможет вам ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...