0

我必须在 sql server 中创建一个基于列列表的动态临时表,例如,我有一个表 ListOfColumns,其中包含许多列名称,这些列引用了一个真实的表

ListOfColumns
ColumnNameA
ColumnNameB
ColumnNameC

我创建了一个函数来获取包含所有这些列的字符串,格式如下:

"ColumnNameA, ColumnNameB, ColumnNameC"

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

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

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

4

2 回答 2

0

您不能创建动态临时表。

原因是临时表与 SQL 会话相关联。当您执行动态 SQL 时,它会创建一个在会话结束时终止的新会话。因此,表是在exec. 然后,当控制移回调用过程时,它会被丢弃(或脱离上下文)。

以下是一些解决方法,您可能都不喜欢:

  1. 创建一个带有规范前缀的表,例如“_”来表示工作表。然后在存储过程中删除此表并捕获异常以在几乎所有情况下删除它。
  2. 创建一个包含所有可能列值的临时表。
  3. 为此类工作表创建您自己的“临时”数据库。
  4. 使用通用列名并将这些通用列与您的列的对应关系保留在其他地方。
于 2012-12-01T18:31:44.130 回答
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'

并且您应该使用正确的列类型创建表。要对其进行测试,请插入一行,然后对其进行查询。

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

要查看此操作,请查看此sql fiddle

请注意,这不会继承约束、索引等——只是列名和类型。

于 2012-12-01T05:27:47.783 回答