2012-12-01 49 views
0

我要创建SQL Server中的动态临时表,总部设在列的列表,例如,我有一个具有列的许多名字表ListOfColumns内是指实际表格动态临时表

ListOfColumns 
ColumnNameA 
ColumnNameB 
ColumnNameC 

我创建一个函数来得到一个字符串,在这种格式的这些列:

"ColumnNameA, ColumnNameB, ColumnNameC" 

现在我需要根据那些叫做报告一个真实的表列创建我的临时表。我可以有更多或更少的列(其动态报告列生成器)

我需要做一个动态SQL,我没有每列的数据类型,我想创建一个临时表与动态SQL和继承我的报表的数据类型。有没有办法做到这一点?

顺便说一句......我不想使用全局变量。 谢谢。

回答

0

如果,例如,您的报告表看起来是这样的:

create table Report (
    ColumnNameA varchar(4), 
    ColumnNameB integer, 
    ColumnNameC integer, 
    ColumnNameD varchar(8), 
    ColumnNameE bit, 
    ColumnNameF integer 
); 

您可以创建以下过程:

create proc copy_table @col_names varchar(128) 
as 
DECLARE @SQLQuery AS NVARCHAR(500) 
SET @SQLQuery = 'SELECT ' + @col_names + ' into ReportTemp from Report where 1 = 0' 
EXEC(@SQLQuery); 

,并使用逗号分隔的列字符串你必须调用它,如下所示:

exec copy_table @col_names = 'ColumnNameA, ColumnNameB, ColumnNameC' 

并且您应该使用正确的列创建表t YPES。要测试它,插入一行然后查询它。

insert into ReportTemp values ('abc', 1, 2); 
select * from ReportTemp; 

要查看此实际情况,请查看此sql fiddle

请注意,这将而不是携带约束,索引等 - 只是列名称和类型。

+0

Thanks @ibrahim但ReportTemp并非临时表,我不想根据您的示例创建物理表,我想创建临时表。 – rgx71

+0

您可以在表名之前添加散列,并将其作为临时表创建。 – Isaac

+0

但我无法插入或查询它,甚至在程序中! – Isaac

0

您无法创建动态临时表。

原因是临时表与SQL会话相关联。当您执行动态SQL时,它会创建一个会话结束时终止的新会话。所以,表格在exec期间被创建。然后当控制返回到调用过程时,它被放弃(或者超出上下文)。

这里有一些变通,没有一个你可能会喜欢:

  1. 与规范前缀创建表,如“_”来表示工作表。然后在存储过程中删除这个表,并在几乎所有情况下捕获异常。
  2. 用所有可能的列值创建一个临时表。
  3. 为这些工作表创建您自己的“临时”数据库。
  4. 使用通用列名称并保留这些通用列与其他地方的列之间的对应关系。