Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 重用表变量?_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

Sql 重用表变量?

Sql 重用表变量?,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我正在数据库上运行特定日期时间段(即2012年1月5日至2012年1月31日)的复杂查询列表。然后我需要在2012年1月6日至2012年6月30日期间运行相同的查询。然后加入结果以用于报告目的 在查询中,我使用了几个表变量来保存临时数据。因为数据库很大,所以表变量的大小也很大。有没有一种方法可以重用这些表变量 删除、截断将不起作用。我必须从@table中删除所有数据吗?如果是的话,它会慢吗?由于@table有很多数据,我是否必须对它执行批删除 顺便说一句,我必须将所有查询放在一个SP文件中,因为

我正在数据库上运行特定日期时间段(即2012年1月5日至2012年1月31日)的复杂查询列表。然后我需要在2012年1月6日至2012年6月30日期间运行相同的查询。然后加入结果以用于报告目的

在查询中,我使用了几个表变量来保存临时数据。因为数据库很大,所以表变量的大小也很大。有没有一种方法可以重用这些表变量

删除、截断将不起作用。我必须从@table中删除所有数据吗?如果是的话,它会慢吗?由于@table有很多数据,我是否必须对它执行批删除

顺便说一句,我必须将所有查询放在一个SP文件中,因为系统的设计方式,我无法调用函数或其他SP

谢谢

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

查询中没有循环。它的工作原理如下:

选择。。。。。选择。。。。。更新。。。。。加入

对日期2012年1月5日至2012年1月5日进行一组查询。然后需要对2012年1月6日至2012年6月30日的相同查询集进行查询

在查询中,有很多逻辑内部,因此我们不能将这两个查询组合成一组查询。由于系统设计的原因,我们无法调用函数或SP进行查询。必须先执行第一组查询,然后依次执行第二组查询

问题是数据太多,@表太大。如果我们能够重用@table,它将解决这个问题

谢谢

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

是的,现在,相同的代码,在两个不同的日期时间间隔重复两次。然而,在代码中,它有一些逻辑内部,基于日期时间之间的差异的不同进程。对不起,我不能发布实际代码。但是,该过程类似于一个以不同日期时间段作为参数的SP

但是,在这种情况下,我不能使用SP/function,因此必须对同一代码硬编码两次。理想情况下,每次我重复代码时都需要使用不同的@table(现在,我需要重复3次),但是由于数据大小,如果我重复3次,@table太大了(每个重复中需要多个@table来完成逻辑部分)

也许我最好用临时桌子?所以我可以在开始新的“重复”时删除它


感谢

当前数据库中没有记录表变量,并且不受事务的影响。为什么您认为截断或删除会比删除更快?你试过这个吗

DECLARE @f TABLE(id INT);

INSERT @f SELECT 1;

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

SELECT id FROM @f;
没有结果。现在,如果删除操作已完全记录在当前数据库中(这使得正常用户表的
delete
速度比
TRUNCATE
慢),则您可能希望
delete
已回滚,并且
SELECT
应已返回数据。但是不,删除不是事务的一部分。因此,您可以从逻辑上得出结论,
DELETE
TRUNCATE
非常相似,如果后者被允许的话


如果必须使用表变量,只需使用delete。如果您发现它很慢,可能不是因为delete,可能是因为您在循环中使用了表变量,而不是使用基于集合的操作。但当然,如果您使用两个不同的@table变量,那么您的代码会慢多少,而不是重复使用一个table变量并在两者之间发出delete命令,那么您比我们任何人都处于更有利的位置。但我仍然认为您的整个过程需要重新研究,因为它在很多方面对我来说都是次优的。

当然,但您真正想要的不是表参数,而是一个临时表

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标志传递给我的存储过程的”。在这种情况下,他可能会从将其转换为临时表中获得一些好处

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
作为旁注,尽管SQLServer文档声称情况并非如此,但我看到过临时表的性能优于表变量的实例。我相信这是因为我把TEMPDB放在一个单独的磁盘上,它有很多IO容量


不过,请务必记住,临时表存在命名问题—如果存储过程试图为临时表创建命名冲突,则可以锁定该存储过程。表变量不会遇到这个问题。

也许您可以显示您的代码。重用表变量意味着可能不需要循环。即使使用循环,也可能不需要表变量。看起来这个洋葱可能有很多层。你为我们做的越多,你的最终解决方案就越好。我不理解你在那里发布的逻辑<代码>选择…选择…更新…加入-这是什么意思?从五月到六月你怎么走?您的代码如何知道运行这两个月的报告?您是否有两个几乎相同的查询硬编码这些日期?我想您正在尝试微优化这里。可悲的是,由于您的查询设计选择,这就像剃牦牛的腿,让它游得更快。是的,也许这就是方法。奇怪的是,它应该有一种方法来“重置”表变量,因为它是一个变量,不是吗?谢谢。这与从表变量中删除有什么不同?你是说临时表总是比表变量好吗?我认为当#表中有大量数据时,删除然后创建#表要比直接删除数据快得多。@urlreader什么是“大量数据”?你测试过这个吗?如何在同一批中删除并创建具有相同名称的#temp表?这应该在编译时被阻止。还要注意的是,您所建议的并不是这个答案所建议的。我认为他不能修改表参数的原因是因为它是以“只读”的形式提交的。在这种情况下,我认为他应该使用临时表。