我很难决定是使用视图还是临时表。
我有一个从程序中调用的存储过程。在SP中,我将一个长查询结果存储在一个临时表中,命名列并对该表进行另一个查询,将结果存储在labels或gridview中,然后删除临时表。我还可以将查询结果存储在一个视图中,并在该视图上进行查询。那么什么更好,或者在什么情况下我必须使用视图/临时表。
根据我的研究,一种观点具有以下优点:安全性,简单性和列名规范。我的临时桌子也满足了这一切(根据我的观点)。
我还想提一下,对于临时桌子,
您不能在同一查询中多次引用TEMPORARY表。
这使得临时表在您想使用自联接的情况下不方便。
取决于
视图必须在每次运行时复制“长查询”的处理,而临时表存储结果。
所以你想使用更多的处理还是更多的存储?
您可以存储一些视图值(持久索引),这可能有助于处理,但您没有提供足够的信息来真正探索这一点。
如果您讨论的只是存储数据供单个过程调用使用,那么temp表是一个不错的选择。
如果查询是“长”的,并且您正在访问多个查询的结果,那么临时表是更好的选择。
一般来说,视图只是select
语句的快捷方式。如果并不意味着结果曾经运行和处理过。如果您使用视图,则每次使用时都需要重新生成结果。尽管视图的后续运行可能更有效(例如,因为视图查询使用的页面在缓存中),但临时表实际上存储了结果。
在SQLServer中,您还可以使用表变量(声明@t表 . . .
)。
在单个存储过程中使用临时表(或表变量)在安全性、简单性和列名方面似乎没有什么影响。安全性将通过访问存储过程来处理。任一解决方案都需要列名。如果没有更多信息,很难判断简单性,但没有什么特别复杂。
问题内容: 有时我们可以同时使用派生表和临时表编写查询。我的问题是哪个更好?为什么? 问题答案: 派生表是一种逻辑构造。 可以将其存储在中,在运行时通过在每次访问时重新评估基础语句来构建,甚至可以对其进行优化。 临时表是一种物理构造。它是在其中创建的表,并在其中填充了值。 哪种更好取决于查询所使用的查询,用于派生表的语句以及许多其他因素。 例如,每次使用时都可以(并且很可能会)重新评估in中的(公
问题内容: 临时表在哪里存储在数据库中?我想删除一个临时表(如果已经存在)。我可以通过查询信息模式来对安全表执行此操作,但是我不知道临时表的存储位置。 问题答案: 临时表存储在tempdb数据库中。这里概述了检查临时表是否存在的多种方法:检查是否存在临时表。
问题内容: 为什么SQL Server坚持认为临时表已经存在!一个或另一个将会发生!,所以永远不会这样。 错误是:数据库中已经有一个名为“#temp1”的对象。 有没有解决这个问题的优雅方法?如果@checkvar为null,我要整个表,否则,只给我其中@checkvar =某物的值 编辑:该列是varchar,而不是int。 问题答案: 您不能只重写语句吗?
问题内容: 情况如下: 我有一个使用SP作为数据集的SSRS报告。SP创建一个临时表,在其中插入一堆数据,然后选择将其退回以供SSRS报告。挺直截了当的。 问题: 如果多个用户在选择了不同参数的情况下运行报表,SP创建的临时表是否会与tempdb冲突,并可能无法返回预期的数据集? 问题答案: 很有可能不会。如果将临时表定义为或,那么您是安全的,因为这类临时表只能由创建连接访问,并且仅在存储过程执行
问题内容: 这是一个悬而未决的问题,但我真的很想听听人们的意见。 我很少使用显式声明的临时表(表变量或常规#tmp表),因为我认为不这样做会导致更简洁,可读性和可调试性的T- SQL。我还认为,与需要临时存储(例如,在查询中使用派生表)时使用SQL相比,SQL可以做得更好。 唯一的例外是当数据库不是典型的关系数据库而是星型或雪花模式时。我了解最好是首先将过滤器应用于事实表,然后使用生成的临时表从维
问题内容: 我正在使用 SQL Server 2012 ,我有一个脚本,通过该脚本我将值插入表中,在该脚本中,我必须根据两个参数转换某些变量的格式。 我可以使用或条件来做到这一点。我不能做任何或在数据库中,我可以参考。 还有其他方法,例如在 脚本中 创建或在 脚本 中应用条件以更改值的格式吗? 问题答案: 是的你可以: