Sql server 2008 SQL Server中的动态插入变量表语句
我有一个变量表:Sql server 2008 SQL Server中的动态插入变量表语句,sql-server-2008,Sql Server 2008,我有一个变量表: DECLARE @A_Table TABLE(ID INT, att1 VARCHAR(100), att2 nvarchar(200)) 我想创建动态sql,所以我在这个表中插入了一些数据(都在一个循环中): 执行此命令后: 因此,我将得到: @A_Table: id att1 att2 1 subject 4.3 2 age 4.5 3 sex 4.1 但我有一个错误: Msg 137, Level 16, State
DECLARE @A_Table TABLE(ID INT, att1 VARCHAR(100), att2 nvarchar(200))
我想创建动态sql,所以我在这个表中插入了一些数据(都在一个循环中):
执行此命令后:
因此,我将得到:
@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".
那么,动态插入变量表的语法是什么呢
好的,我理解了。您有一个表变量,而不是包含表名的变量 因此,您需要以下内容
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
关于BOL中临时表的一些好信息
-在这一页的下面
以及表
类型
您的EXEC语句出现在不同的上下文中,因此不知道在原始上下文中创建的任何变量。您可以使用
插入。。。EXEC
插入动态选择返回的数据的语法。当然,您需要从动态语句中删除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
虽然(@i创建动态插入查询确实是一项任务,但我也很难找到它,最后我尝试了以下方法,并成功运行。请查找下面的代码
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
希望这会对您有所帮助。它一直说,@A_Table
没有声明,但它是……`Msg 1087,15级,状态2,第1行必须声明表变量“@A_Table”.`如何声明@sql,您建议使用时态表吗?这是因为@a_表不在同一范围内,这取决于您试图实现什么,但您可以添加语句来声明变量并在@sql内插入,然后执行(@sql),但您可能需要一个临时表。这将允许在不同的范围内声明它。在这种情况下,使用sp_execute
是否更有效?@darkcminor:google搜索exec vs sp_executesql
的结果并没有向我揭示exec()的任何特殊优势
oversp_executesql
在我称之为普通案例的情况下,我将包括你的案例。很抱歉,我不能告诉你太多,但人们肯定已经对这件事进行了更深入的研究。
CREATE TABLE #testtbl (ID INT);
EXEC ('INSERT INTO #testtbl VALUES (1)');
SELECT * FROM #testtbl
DROP TABLE #testtbl
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
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