在SQL Server 2008中使用动态sql构建临时表

时间:2010-10-15 16:03:59

标签: sql sql-server-2008 dynamic temp-tables

长话短说......

我正在构建一个Web应用程序,用户可以在其中选择约40个参数的任意组合。但是,对于他们想要的结果之一(投资经验),我必须从不同的表中提取信息并比较六个不同列(股票exp,共同基金exp等)中的值,并仅返回六个中的最高值对于那个特定记录。

这不是问题。问题是在运行时,我查找投资exp的查询不一定知道帐户ID。考虑到表扫描会带来超过50万客户端,这不是一种选择。所以我要做的是编辑我的主要动态构建查询的副本,但不是返回30多列,它只返回2,accountid和experienceid(这是体验表的PK)所以我可以做过滤处理。

有些人可能会定义与我不同的动态SQL。我的查询是一个字符串,根据发送到我的过程的参数,where子句的部分将由开关打开或关闭。最后我执行,它都在服务器端完成,所有的Web应用程序都会向我的proc发送一个参数数组。

我的简化代码看起来基本上是这样的:

declare @sql varchar(8000)
set @sql = 
'select [columns]
into #tempTable
from [table]
[table joins]' + @dynamicallyBuiltWhereClause

exec(@sql)

在这部分之后我尝试使用#tempTable进行投资体验过滤过程,但是我收到错误告诉我#tempTable不存在。

非常感谢任何和所有帮助。

1 个答案:

答案 0 :(得分:2)

问题是临时表的范围仅存在于exec()语句中。您可以使用2个哈希符号将临时表转换为“全局”临时表 - > ##不是Temptable。但是,我想知道为什么要使用变量@dynamicallyBuiltWhereClause来生成SQL语句。

我已经完成了你过去所做的事情,但是从应用程序生成SQL(使用C#生成我的SQL)有了更好的成功。

此外,您可能需要查看表变量。我看到一些使用临时表的奇怪实例,其中应用程序重新使用连接,并且上一个查询中的临时表仍然存在。