Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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_Tsql - Fatal编程技术网

临时删除大型SQL表中某些列中的数据并稍后将其恢复的策略

临时删除大型SQL表中某些列中的数据并稍后将其恢复的策略,sql,sql-server,tsql,Sql,Sql Server,Tsql,我在SQL Server上有一个60列的表。我必须临时删除10-15列中的数据,而不是整个表的日期范围,以便我可以执行一些报告查询,然后在几天后执行另一个报告查询,删除的数据恢复为列。 下表说明了我正在努力实现的目标 表A |1 |2 |3 |4 |5 |....|55|56|57|58|59|60| --------------------------------------- |1 |2 |3 |4 |5 |....| 1| 2| 3| 4| 5| 6| |1 |2 |3 |4 |5 |..

我在SQL Server上有一个60列的表。我必须临时删除10-15列中的数据,而不是整个表的日期范围,以便我可以执行一些报告查询,然后在几天后执行另一个报告查询,删除的数据恢复为列。 下表说明了我正在努力实现的目标

表A

|1 |2 |3 |4 |5 |....|55|56|57|58|59|60|
---------------------------------------
|1 |2 |3 |4 |5 |....| 1| 2| 3| 4| 5| 6|
|1 |2 |3 |4 |5 |....| 7| 8| 9|10|11|12|
删除第55-60列中的数据并执行下表中的报告

表B

|1 |2 |3 |4 |5 |....|55|56|57|58|59|60|
---------------------------------------
|1 |2 |3 |4 |5 |....|0 |0 |0 |0 |0 |0 |
|1 |2 |3 |4 |5 |....| 7| 8| 9|10|11|12|
几天后,将删除的数据恢复到表A并执行另一个查询

这里的问题是表A的大小约为50gb,我必须从记录为10到10万的列中删除数据

我已尝试选择要删除到临时表中的列,并用0s更新列数据。几天后,使用update语句将它们移回原处,但这对单用户来说效果良好。当有多个用户运行报表查询时,此策略会导致一些性能问题,因为由于更新,查询需要更长的时间

在这种情况下,有没有其他策略可以使用?我想听听你的经验和建议


注意:我不想从查询中排除所选列。只想根据日期范围删除所选列的部分数据,但对于其他日期,我们在对所有列求和时会考虑这些数据。

只需创建一个视图并将其用于报告:

create view v_t
    select col1, col2, . . .
           (case when <condition> then 0 else col55 end) as col55,
           (case when <condition> then 0 else col56 end) as col56,
           (case when <condition> then 0 else col57 end) as col57,
           (case when <condition> then 0 else col58 end) as col58,
           (case when <condition> then 0 else col59 end) as col59,
           (case when <condition> then 0 else col60 end) as col60
    from t;
创建视图v\t
选择col1,col2。
(如果为0,则为col55结束)作为col55,
(如果为0,则为col56 end)作为col56,
(如果为0,则col57结束)作为col57,
(如果为0,则为col58结束)作为col58,
(如果为0,则为col59结束)作为col59,
(如果为0,则为col60结束)作为col60
从t;
我不完全理解这种情况,但它似乎涉及一个或多个日期列


使用报告的视图。

只需创建一个视图并将其用于报告:

create view v_t
    select col1, col2, . . .
           (case when <condition> then 0 else col55 end) as col55,
           (case when <condition> then 0 else col56 end) as col56,
           (case when <condition> then 0 else col57 end) as col57,
           (case when <condition> then 0 else col58 end) as col58,
           (case when <condition> then 0 else col59 end) as col59,
           (case when <condition> then 0 else col60 end) as col60
    from t;
创建视图v\t
选择col1,col2。
(如果为0,则为col55结束)作为col55,
(如果为0,则为col56 end)作为col56,
(如果为0,则col57结束)作为col57,
(如果为0,则为col58结束)作为col58,
(如果为0,则为col59结束)作为col59,
(如果为0,则为col60结束)作为col60
从t;
我不完全理解这种情况,但它似乎涉及一个或多个日期列


使用报表的视图。

不要临时删除值,将其移到其他表中几天,然后再次将值重新填充到该表中,而应通过在CASE语句中添加日期范围,将该逻辑注入报表查询本身。假设您希望将第55列的结果作为日期范围“2018-12-01”到“2009-12-31”的0,然后使用以下查询

SELECT 1,2,3,4,5.., 
    CASE 
       WHEN CURRENT_DATE BETWEEN '2018-12-01' AND '2009-12-31' then 0 else 55 
       END As 55
FROM [tablename];    

您应该通过在CASE语句中添加日期范围,将该逻辑注入报表查询本身,而不是临时删除这些值,将其移动到其他表几天,然后再次将这些值填充到该表中。假设您希望将第55列的结果作为日期范围“2018-12-01”到“2009-12-31”的0,然后使用以下查询

SELECT 1,2,3,4,5.., 
    CASE 
       WHEN CURRENT_DATE BETWEEN '2018-12-01' AND '2009-12-31' then 0 else 55 
       END As 55
FROM [tablename];    

如前所述,您的问题的最优雅解决方案将涉及使用单独的结构,例如: -创建视图 -使用存储过程 -在报表本身中添加筛选

对于这些选项,我想补充的是,您可以使用安全性来限制用户可以访问的列。在这种情况下,您可以限制运行报表的用户对表的访问。有关如何执行此操作的更多详细信息,请参阅以下文章:


如前所述,解决您的问题的最优雅的解决方案将涉及使用单独的结构,例如: -创建视图 -使用存储过程 -在报表本身中添加筛选

对于这些选项,我想补充的是,您可以使用安全性来限制用户可以访问的列。在这种情况下,您可以限制运行报表的用户对表的访问。有关如何执行此操作的更多详细信息,请参阅以下文章:


使用视图。为什么报表软件必须直接引用表?我需要从日期范围的列中删除数据,而不是从整个表列中删除数据。可能我需要在问题描述中添加这一点。正如Gordon所说,为报表塑造数据,不要更改数据,这对性能来说是危险的、糟糕的和可怕的。或者使用存储过程作为视图的替代。重命名列,使用原始名称创建新列,根据您的条件复制数据。使用视图。为什么报表软件必须直接引用表?我需要从日期范围的列中删除数据,而不是从整个表列中删除数据。可能我需要在问题描述中添加这一点。正如Gordon所说,为报表塑造数据,不要更改数据,这对性能来说是有风险的、不好的和糟糕的。或者使用存储过程替代视图。重命名列,使用原始名称创建新列,根据您的条件将数据复制回。创建视图会使事情变得复杂,因为我有许多客户端,每个客户端都有不同的列数据删除配置。@user1534115听起来更像一个。您暂时“隐藏”某个报表的一段时间内的实际值,但是使用该表的所有其他内容呢?翻转同义词可能是一种选择,但听起来您不想更改现有设计。没有简单的解决方案。创建视图会使事情复杂化,因为我有许多客户端,每个客户端都有不同的列数据删除配置。@user1534115听起来更像一个。你暂时