Sql server 2008 使用动态sql填充临时表
我知道这并不理想,但我想知道是否可以基于动态sql填充临时表 中显示了一个与我想要实现的目标非常类似的示例,如下所示:Sql server 2008 使用动态sql填充临时表,sql-server-2008,dynamic-sql,temp-tables,Sql Server 2008,Dynamic Sql,Temp Tables,我知道这并不理想,但我想知道是否可以基于动态sql填充临时表 中显示了一个与我想要实现的目标非常类似的示例,如下所示: SELECT into #T1 execute ('execute ' + @SQLString ) 或 我两个都不能工作。从编辑来看,第一个选项似乎是错误的,所以对于第二个选项,我尝试了类似的方法 DECLARE @SQLString VARCHAR (2000) = 'SELECT * FROM INFORMATION_SCHEMA.COLUMNS' INSERT in
SELECT into #T1 execute ('execute ' + @SQLString )
或
我两个都不能工作。从编辑来看,第一个选项似乎是错误的,所以对于第二个选项,我尝试了类似的方法
DECLARE @SQLString VARCHAR (2000) = 'SELECT * FROM INFORMATION_SCHEMA.COLUMNS'
INSERT into #MyTempTable execute (@SQLString )
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
任何想法都非常感谢
编辑:
为了澄清我试图做什么而不过于本地化,我在下面尽可能简短地解释
我在数据库的暂存区域中有数据,其中包含具有动态名称和动态列数的表。但是,每个表的一些列名是相同的。我希望能够简单地将已知列提取到一个临时表(或表变量、CTE、派生表或其他什么)中,并对其执行操作,而不是在动态sql中构造所有内容
如此给予如此的一张桌子
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 @SQLString VARCHAR (2000) = 'SELECT * FROM INFORMATION_SCHEMA.COLUMNS'
INSERT into #MyTempTable execute (@SQLString )
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模式等价物,并使用“合并并输出到”将DboId与暂存表Id匹配,如前所述,等等
如果您能想出任何其他方法来限制由于表名是动态的而需要编写的动态SQL的数量,请告诉我。假设#mytentable已经存在:
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;
通常有助于解释“无法上班”的含义。你有错误吗?什么事?对不起。如果您复制我文章末尾的非常简单的代码段并执行它,那么在我将上面的示例中的SQLString更改为@sql之后,您应该会得到“无效的对象名”#MyTestable“,我在上面的示例中遇到了相同的错误-无效的对象名“#mytentable”。我刚刚重新阅读了您的帖子,其中假设#mytentable已经存在。这很可能是我的问题。您知道我可以用什么方法定义临时表的结构,以及通过动态sql填充它吗。这很可能是我的问题的原因。我的印象是,与类似,临时表的结构是根据正在运行的查询定义的。再次澄清您实际尝试执行的操作可能会有所帮助。为什么这里需要临时表?在它被填充之后,你还用它做什么?再次感谢您的快速响应。我不想把问题和长话短说混为一谈。然而,将数据放入临时表的目的将使我能够最小化需要编写的动态sql的数量。动态sql从源于平面文件的数据库暂存区域提取数据。暂存表名称是动态的,每个表具有不同的列数(因此使用动态sql)。通过用户验证和列映射,我们的目标是将数据复制到数据库dbo模式部分的表中。顺便说一下,我不能让你的最后一个例子起作用。同样的错误在玩了你的例子之后,我可以通过删除最后一行的INSERT#mytentable来实现它。然而,这意味着临时表只能从动态sql中获得,这并不是我真正想要的。我不想引用我的动态表名,因为我知道这样做的唯一方法是通过动态sql。