1

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

这个答案中显示了一个与我想要实现的非常相似的例子

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 匹配OUTPUT INTO如此所述,依此类推。

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

4

1 回答 1

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;
于 2012-08-07T13:48:55.223 回答