使用动态sql填充临时表

时间:2012-08-07 13:47:39

标签: sql-server-2008 dynamic-sql temp-tables

我知道这不太理想,但我想知道是否可以基于动态sql填充临时表?

我希望实现的一个非常类似的示例在this answer中显示为

SELECT into #T1 execute ('execute ' + @SQLString )

INSERT into #T1 execute ('execute ' + @SQLString )

我无法上班。从编辑看来,第一个选项是错误的,所以对于第二个选项,我尝试了类似的东西;

DECLARE @SQLString VARCHAR (2000) = 'SELECT * FROM INFORMATION_SCHEMA.COLUMNS'

INSERT into #MyTempTable execute (@SQLString )

非常感谢任何想法。

修改

为了澄清我想要做的事情而不是过于本地化,我会在下面简要解释一下。

我在数据库的暂存区域中有数据,其中包含具有动态名称和动态列数的表。但是,每个表的一些列名相同。而不是在动态sql中构造所有内容,我希望能够简单地将已知列提取到临时表(或表变量,CTE,派生表或其他)中并对其进行操作。

所以给出了一张表;

  CREATE TABLE SomeParticularNameThatCantBeKnownToAStoredProc (
      [1] AS VARCHAR(100),
      [2] AS VARCHAR(100),
      ... -- Could be any number of these columns
      [Id] AS INT,
      [KnownCol] AS VARCHAR(100),
      [KnownCol2] AS VARCHAR(100),
      ....
      [DboId] AS INT
  )

我希望能够执行必要的操作以允许我处理这些数据而无需在动态sql中完成所有操作。我希望能够做类似的事情;

  DECLARE @TableName AS VARCHAR(1000) = 'SomeParticularNameThatCantBeKnownToAStoredProc'

  SELECT [Id], [KnownCol], [KnownCol2], [DboId] 
  INTO #KnownName
  FROM @TableName -- I know this isn't possible, but this is what I'd like to do

这将允许我针对一致的#KnownName执行SQL语句。我需要做的其他一些操作非常冗长,例如使用数据与其他现有表相关,将数据从登台表复制到其dbo模式等价物,并使用MERGE将DboId与登台表Id匹配按照here所述输出INTO,依此类推。

如果您能想到任何其他方式,我可以限制我需要编写的动态SQL的数量,因为表名是动态的,请告诉我。

1 个答案:

答案 0 :(得分:2)

假设#MyTempTable已经存在:

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT * FROM INFORMATION_SCHEMA.COLUMNS;';
INSERT #MyTempTable EXEC sp_executesql @SQLString;

否则请澄清您要做的事情。如果尚未创建表,则可以在动态SQL中执行所有操作,例如:

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT * INTO #MyTempTable FROM INFORMATION_SCHEMA.COLUMNS;
  SELECT * FROM #MyTempTable;';
EXEC sp_executesql @sql;