重用表变量?(Reuse a table variable?)

2019-10-17 01:47发布

我对某些日期时间段(即05/01/2012到收取罚金)的数据库上运行复杂的查询列表。 然后,我需要运行06/01/2012同一查询06月30日。 然后再加入报表目的的结果。

在查询,我用几个表变量来存储临时数据。 因为数据库是大,表变量尺寸大了。 有没有办法,我可以重复使用这些表变量的方法吗?

DROP,截断将无法正常工作。 我必须从@table删除所有数据? 如果是这样,这将是慢? 我要做的批量删除,因为它有很多数据的@table?

顺便说一句,我必须把所有查询在一个SP文件,不能打电话,因为该系统的设计方式函数或其他SP。

谢谢

=============================

没有在查询没有循环。 它的工作原理是:

选择.....选择.....更新.....加入......

做一组日期2012/05/01查询到收取罚金。 然后需要为06/01/2012至06月30日同一组查询。

在查询中,有大量的逻辑里面,所以我们无法将这些2组合成一组查询。 因为系统的设计,我们不能要求查询功能或SP。 要做的第一组查询,那么第2集顺序查询。

问题是有太多的数据,该@table太大。 如果我们可以重用@table,它会解决这个问题。

谢谢

===============================

是,现在,相同的代码,对于2个不同的日期时间间隔重复两次。 然而,在代码,它具有基于日期时间之间的差一些逻辑内,不同的过程。 对不起,我不能发布的实际代码。 但是,该方法是像具有不同日期时间周期作为参数的SP。

不过,我不能在这种情况下使用SP /功能,所以必须硬编码相同的代码两次。 理想情况下,就需要使用不同的@table每次我重复代码(现在,我需要重复3次)的,但由于数据的大小,如果我重复3次@table过大(需要在每个多@table做逻辑部分)。

也许我最好使用临时表? 因此,当启动一个新的“重复”我降了吗?

谢谢

Answer 1:

表变量没有登录在当前数据库中,并没有受到交易。 为什么你认为一个截形或下降将是任何比删除快? 您是否尝试过这个?

DECLARE @f TABLE(id INT);

INSERT @f SELECT 1;

BEGIN TRANSACTION;
DELETE @f WHERE id = 1;
ROLLBACK TRANSACTION;

SELECT id FROM @f;

没结果。 现在,如果删除了当前数据库完全记录(这是什么使DELETETRUNCATE对于普通用户表),您所期待的DELETE已经回滚,而SELECT应该有返回的数据。 但是,没有,删除不交易的一部分。 你可以在逻辑上的结论,那么, DELETETRUNCATE将是相当类似的,如果不相同,分别为后者允许的。

如果你必须使用一个表变量,只需使用删除。 如果你觉得慢,这可能不是删除的原因,有可能是因为您正在重新使用表变量在一个循环中,而不是使用基于集合的操作。 不过,当然你是比我们任何一个更好的位置,以检验慢多少,如果你使用两种不同的@table变量与您的代码将被重新使用单个表变量和发行之间的删除英寸 但我仍然认为你的整个过程中需要重新研究,因为它听起来次优我在许多层面上。



Answer 2:

当然,但你真正想要的是不是表参数,相反,你需要一个临时表。

CREATE TABLE #my_temp_table (column1 int, column2 varchar(max), ...)
INSERT INTO #my_temp_table (column1, column2) VALUES (...)
-- Use the temporary table here
DELETE FROM #my_temp_table
INSERT INTO #my_temp_table (column1, column2) VALUES (...)
-- Use the temporary table again
DROP TABLE #my_temp_table

编辑:提交者可能会说“因为它传递到我的存储过程旗READONLY我不能使用表变量”。 在这种情况下,他可能会得到一些里程出来将其转换为一个临时表。

作为一个侧面说明,尽管SQL Server的文件宣称,这是不是这样的,我曾经见过的临时表进行比表变量更好的实例。 我相信这是因为我把我的TEMPDB一个单独的磁盘,其中有大量的IO能力提供上。

请千万记住,虽然,临时表从命名问题的困扰 - 如果它试图创建临时表命名冲突,你可以锁定一个存储过程。 表变量不从问题的困扰。



文章来源: Reuse a table variable?