我经常对SQL数据库进行静态分析,在此期间,除了我之外,没有人可以更改数据。
但是,我还没有找到一种方法来“告诉”这个SQL,以防止多次运行相同的查询。
以下是我想要做的事情,首先我从一个输出非常小的复杂查询开始。
SELECT * FROM MYTABLE WHERE MYPROPERTY = 1234
然后我从同一个窗口运行一个简单的查询(如果相关的话,主要使用SQL server studio)
SELECT 1
现在我突然意识到我忘记保存第一个复杂(慢)查询的结果。
正如我所知,基础数据没有改变(或者即使它确实发生了)我想退一步,只是得到结果。但是目前我不知道这样做的任何技巧,我必须再次运行整个查询。
所以问题摘要是:我如何(自动存储/)从最近执行的查询中获取结果。
我特别感兴趣的是简单的选择查询,并且很乐意为自动结果存储分配100MB内存。更喜欢在SQL Server Studio中使用T-SQL的解决方案,但也欢迎其他SQL解决方案。
编辑:我不是在寻找一种手动防止这种情况发生的方法。在我可以预见到问题的情况下,它不会发生。
答案 0 :(得分:2)
我经常遇到这种情况,我经常只将长时间运行的查询的结果抛到临时表中:
SELECT *
INTO #results1
FROM MYTABLE WHERE MYPROPERTY = 1234
SELECT *
FROM #results1
如果查询的运行时间非常长,我可能会使用“真正的”表。这是节省重新运行时间的好方法。
缺点是它会增加您的查询。
您还可以将查询结果发送到SSMS中的文件,格式化输出的信息位于:SSMS Results to File
答案 1 :(得分:2)
这不能在Microsoft SQL Server中完成。 SQL Server不缓存结果,而是缓存查询访问的数据页。这应该会使您的查询第二次更快地运行,因此重新运行它不会那么痛苦。
在其他数据库中,例如Oracle和MySQL,它们确实有一个查询缓存机制,可以让你直接在第二次检索结果。
答案 2 :(得分:1)
最简单的方法是在自己的SSMS窗口中运行每个查询,结果将保留在那里,直到你关闭它,或者内存不足 - 除此之外,我不确定是否有办法完成什么你想要的。
关闭SSMS窗口后,我认为无法找回“缓存”结果。
答案 3 :(得分:1)
这不是您问题的技术答案。经过多年的书面查询和查看结果,我习惯将结果保存在Excel中,无论我使用的数据库/查询工具如何。
Excel中的格式非常有条理:
我将查询放在“B”列中,因此我可以转到“A”列并使用它来到第一行。我将结果放在“C”列中,因此我可以转到“B”列并用于在查询之间移动。
我主要这样做,所以我可以回去看看我几个月前做过的工作。例如,某人从2月份发送了一封电子邮件并说“再次这样做”。我可以回到2月的电子表格,转到它创建的那一天,看看我当时在做什么。
在你的问题中,我意识到我现在本能地解决了这个问题,因为“右键单击网格,使用列标题进行复制,使用alt-tab进行excel,alt-V”是一种我非常喜欢的行为自然。
答案 4 :(得分:1)
我打算建议你将每个查询运行到一个带有计数器(存储在表中)的脚本中,每次执行查询时增加(即i ++)并将每个查询存储在名为“tmpTable”的临时表中+ i ,但管理起来听起来很复杂。我是对的吗?
然后我用谷歌搜索,我发现了这个工具包:我没试过,但你可以看看:
http://www.ssmstoolspack.com/Features
希望它有所帮助。
编辑:添加了以下链接。可以选择输出XML文件,他们也提到 SQL Server Integration Services 作为可能的解决方案。 http://michaeljswart.com/2012/03/sending-query-results-to-others/#method5
第二次编辑:这也是这个独立于DBMS的工具,听起来很有趣:
答案 5 :(得分:0)
我不确定这是你想要的。无论如何检查我的答案
在sql server management studio中,您可以打开多个选项卡来执行查询。为每个查询打开新选项卡,然后在该选项卡下可以使用已执行查询的结果。
在选项卡中执行一个查询后,不要将该选项卡用于新查询,请打开该作业的新选项卡。
答案 6 :(得分:0)
您是否考虑过使用某种脱机SQL客户端,例如Excel?具体来说,Excel会将结果检索到电子表格(使用数据功能区/菜单),这些结果将作为结果存储。它会在必要时提示您刷新,或者您可以按需提供。
关于它是否可以在T / SQL或其他数据库中完成的问题取决于数据库和结果缓存,即使这样,它们也是查询处理器可以使用的选项,而不是单个查询的保证。