我知道这不太理想,但我想知道是否可以基于动态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的数量,因为表名是动态的,请告诉我。
答案 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;