Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 SQL Server中的动态插入变量表语句_Sql Server 2008 - Fatal编程技术网

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()的任何特殊优势
over
sp_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