我有一个变量表:
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)
您有一个表变量,而不是包含表名的变量.
所以你需要以下内容.
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