动态插入变量表语句SQL Server

cMi*_*nor 6 sql-server-2008

我有一个变量表:

DECLARE @A_Table TABLE(ID INT, att1 VARCHAR(100), att2 nvarchar(200))
Run Code Online (Sandbox Code Playgroud)

我想制作动态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 
Run Code Online (Sandbox Code Playgroud)

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).... 
Run Code Online (Sandbox Code Playgroud)

并执行此操作后:我会得到:

@A_Table:
id    att1   att2
1   subject   4.3
2   age       4.5
3   sex       4.1
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

Msg 137, Level 16, State 1, Line 48
Must declare the scalar variable "@A_Table".
Run Code Online (Sandbox Code Playgroud)

那么动态插入变量表的语法是什么?

好的,我明白了.

And*_*y M 10

您可以使用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;
  INSERT INTO @A_Table (ID,att1,att2)
    EXEC (@sql);
END
Run Code Online (Sandbox Code Playgroud)


Chr*_*ver 6

您有一个表变量,而不是包含表名的变量.

所以你需要以下内容.

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 
Run Code Online (Sandbox Code Playgroud)

您还需要将表变量声明为变量内的语句@sql,并执行您的声明表并插入在一起,或使用本地/全局临时表.

使用本地临时表(存储在tempdb中),您可以执行类似这样的操作.

CREATE TABLE #testtbl (ID INT);
EXEC ('INSERT INTO #testtbl VALUES (1)');
SELECT * FROM #testtbl
DROP TABLE #testtbl
Run Code Online (Sandbox Code Playgroud)

关于BOL中临时表的一些很好的信息

http://msdn.microsoft.com/en-us/library/ms174979.aspx - 相当远的页面

table类型.

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

  • 那是因为@A_Table不在同一个范围内,它取决于你想要实现的内容,但你可以添加语句来声明你的变量并在@sql中插入然后执行(@sql),但你可能需要一个临时表来代替.这将允许它在不同的范围内声明http://www.sqlteam.com/article/temporary-tables (2认同)