动态插入变量表语句SQL Server

时间:2011-03-04 16:20:26

标签: sql-server-2008

我有一个变量表:

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).... 
执行此操作后

AND: 所以我会得到:

@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".

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

好的,我明白了。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:5)

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

所以你需要以下内容。

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

答案 2 :(得分:3)

您的EXEC语句出现在不同的上下文中,因此不知道在原始上下文中创建的任何变量。

答案 3 :(得分:0)

要创建动态插入查询,这真的是一项任务,我也很难找到它,最后我尝试了以下方式并且它已成功运行。请找到以下代码。

 int main() {
    BTree node2 = (BTree)malloc(sizeof(struct Node));
    BTree node5 = (BTree)malloc(sizeof(struct Node));
    BTree node7 = (BTree)malloc(sizeof(struct Node));
    BTree node6 = (BTree)malloc(sizeof(struct Node));
    BTree node9 = (BTree)malloc(sizeof(struct Node));

    node2->data = 2;
    node5->data = 5;
    node7->data = 7;
    node6->data = 6;
    node9->data = 9;        

    node2->lchild = NULL;
    node5->lchild = NULL;
    node7->lchild = NULL;
    node6->lchild = NULL;
    node9->lchild = NULL;

    node2->rchild = NULL;
    node5->rchild = NULL;
    node7->rchild = NULL;
    node6->rchild = NULL;
    node9->rchild = NULL;

    node5->lchild = node2;
    node5->rchild = node7;
    node7->lchild = node6;
    node7->rchild = node9;

    BTree root = node5;
    Display(root);
    system("pause");
}

希望这会对你有帮助..