优化T-SQL,在其中使用数组会更好

优化T-SQL,在其中使用数组会更好,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,好的,首先你需要拿一个呕吐袋。我的任务是优化数据库中的几个旧存储过程。此SP执行以下操作: 1) 光标在一系列“建筑物”中循环 2) 光标循环一周,星期日和星期六 3) 有一组庞大的IF块,负责计算给定建筑中存在多少种类型的对象 基本上,您将在这个代码块中看到的是,如果有5个类型为#2的对象,它将把@type#u 2_objects_5增加1 IF @Number_Type_1_Objects = 0 BEGIN SET @Type_1_Objects_0 =

好的,首先你需要拿一个呕吐袋。我的任务是优化数据库中的几个旧存储过程。此SP执行以下操作:

1) 光标在一系列“建筑物”中循环

2) 光标循环一周,星期日和星期六

3) 有一组庞大的IF块,负责计算给定建筑中存在多少种类型的对象

基本上,您将在这个代码块中看到的是,如果有5个类型为#2的对象,它将把@type#u 2_objects_5增加1

    IF @Number_Type_1_Objects = 0
    BEGIN
        SET @Type_1_Objects_0 = @Type_1_Objects_0 + 1
    END
    IF @Number_Type_1_Objects = 1
    BEGIN
        SET @Type_1_Objects_1 = @Type_1_Objects_1 + 1
    END
    IF @Number_Type_1_Objects = 2
    BEGIN
        SET @Type_1_Objects_2 = @Type_1_Objects_2 + 1
    END
    IF @Number_Type_1_Objects = 3
    BEGIN
        SET @Type_1_Objects_3 = @Type_1_Objects_3 + 1
    END
[... Objects_4 through Objects_20 for Type_1]

IF @Number_Type_2_Objects = 0
    BEGIN
        SET @Type_2_Objects_0 = @Type_2_Objects_0 + 1
    END
    IF @Number_Type_2_Objects = 1
    BEGIN
        SET @Type_2_Objects_1 = @Type_2_Objects_1 + 1
    END
    IF @Number_Type_2_Objects = 2
    BEGIN
        SET @Type_2_Objects_2 = @Type_2_Objects_2 + 1
    END
    IF @Number_Type_2_Objects = 3
    BEGIN
        SET @Type_2_Objects_3 = @Type_2_Objects_3 + 1
    END
[... Objects_4 through Objects_20 for Type_2]

除了非常粗糙(并且限制为20个对象),这似乎是一种可怕的处理方式。在传统语言中,这可以用二维数组轻松解决

objects[type][quantity] += 1;
我是一个T-SQL新手,但由于编写存储过程通常会使用大量临时表(基本上可能是二维数组),我想知道是否有人能提供一种更好的方法来处理这样的情况,即存储两个动态数据段

在评论中要求
这些柱子很简单

  • 数量\u类型\u 1 \u对象
  • 数量\u类型\u 2 \u对象
  • 数量\u类型\u 3 \u对象
  • 数量\u类型\u 4 \u对象
  • 数量\u类型\u 5 \u对象
  • 当前日期时间
表中的每一行代表5分钟

预期的输出是计算出给定数量的对象每天出现的时间百分比

Sunday - Object Type 1 
0 objects - 69 rows, 5:45, 34.85% 
1 object - 85 rows, 7:05, 42.93% 
2 objects - 44 rows, 3:40, 22.22%

周日,有34.85%的时间有0个1型物体。42.93%的时间里有1个物体,22.22%的时间里有2个物体。对每种对象类型重复上述操作。

一个快速简便的解决方案是执行类似于

select 'type1objects' as objecttype
       datepart(dw, currentdatetime) as dayofweek, 
       number_type_1_objects as numberofobjects, 
       count(number_type_1_objects) as rows
from yourtable
group by convert(varchar(10), currentdatetime,101), datepart(dw, currentdatetime), number_type_1_objects
union
select 'type2objects' as objecttype
       datepart('d',currentdatetime) as dayofweek,
       number_type_2_objects as numberofobjects, 
       count(*) as rows
from yourtable
group by convert(varchar(10),currentdatetime,101), datepart(dw,currentdatetime), number_type_2_objects

对于每个对象列,依此类推。这应该可以让你在不使用那些疯狂的变量和游标的情况下,得到你现在得到的数据的近似值,而建筑物是无法承受的。不过,您也可以加入buildings表,只需将其添加到group by中即可。我不确定,因为我不知道这段关系将以什么为基础……

我在向袋子里呼吸——它不起作用。这将有助于查看相关表格的列、一些示例数据和预期结果示例。编辑我的帖子,希望包含这些信息。