我有一个变量表:
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".
那么动态插入变量表的语法是什么?
好的,我明白了。
答案 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
类型。
答案 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");
}
希望这会对你有帮助..