序曲:这个数据库的设计真的太可怕了 - 这不是第一个"歪曲的"问题我问过,它不会是最后一个问题。问题是它是什么,我只是问,因为A)我只有几年的SQL Server经验,而且B)我已经在我的键盘上为一对夫妇砸了我的脸试图找到可行的解决方案。
说完所有这些......
我们有一个包含两个与此问题相关的表的数据库。架构是荒谬的,所以我要解释一下,以便可以理解:
T_Customer& T_Task
T_Task保存有关代表T_Customer中的客户执行的各种工作的数据。
在T_Customer中,有一个名为" Sort_Type"的字段。 (再次,改述......)。在该字段中,存在来自T_Task的各种字段的串联字符串,其按指定的顺序确定如何在客户端程序中生成客户的报告。 T_Task中共有73个可能的字段,可以在T_Customer中选择为Sort_Type,用户可以按任何给定的顺序选择最多5个字段。例如:
T_Customer
Customer_ID | Sort_Type
------------|-------------------------------
1 | 'Task_Date,Task_Type,Task_ID'
2 | 'Task_Type,Destination'
3 | 'Route,Task_Type,Task_ID'
T_Task
Task_ID | Customer_ID | Task_Type | Task_Date | Route | Destination
--------|-------------|-----------|-----------|---------|-------------
12345 | 1 | 1 | 01/01/2017| '1 to 2'| '2'
12346 | 1 | 1 | 01/02/2017| '3 to 4'| '4'
12347 | 2 | 2 | 12/31/2016| '6 to 2'| '2'
12348 | 3 | 3 | 01/01/2017| '4 to 1'| '1'
在此示例中,客户#1的报告将由Task_Date排序/合计,然后由Task_Type排序/合计,然后由Task_ID排序;但不仅仅是做一个ORDER BY。此功能需要一个单独的值,可以作为一个整体,单个单元进行排序。就这样......
直到今天,T_Task中存在一个字段叫做(释义....)' MySort'。此字段包含一个由零填充的固定宽度值的串联字符串,并根据T_Customer.Sort_Type中值的顺序和内容创建。在这种情况下:
Task_ID | Customer_ID | Task_Type | Task_Date | Route | Destination | MySort
--------|-------------|-----------|-----------|-------|-------------|-------
12345 | 1 | 1 | 01/01/2017| 1 to 2| 2 |'002017010100000000010000012345'
12346 | 1 | 1 | 01/02/2017| 3 to 4| 4 |'002017010200000000010000012346'
12347 | 2 | 2 | 12/31/2016| 6 to 2| 2 |'000000000000000000020000000002'
12348 | 3 | 3 | 01/01/2017| 4 to 1| 1 |'000040to0100000000030000012348'
在每个报告的打印阶段,程序将搜索客户,在T_Customer.Sort_Type中查找值,用逗号分隔,然后对该客户的所有任务运行更新以更新值相应的MySort ...
你能猜出这个问题是什么吗?表现(更不用说慢性精神错乱)
我的任务是在SQL Server 2005中找到一种更有效的方法来执行相同的任务服务器端,如果可能的话,使用最终允许我返回结果集的任何方法,包括所请求任务的所有细节,以及类似于过去使用的串联字符串(客户端程序依赖于该字符串以对报告进行排序和小计)。
我尝试了计算列中的Views,UDF和参数化查询,但我知道我的局限性。我很缺乏经验,无法了解我的所有选择。
问题:除了退出(不是选项)或疯狂(考虑到......),您可以使用哪些方法来解决这个问题?
编辑:收到有关MySort专栏的两个问题, 我会更好地解释一下。
T_Task.MySort =
REPLICATE('0',10 - LEN(T_Customer.Sort_Type[Value1]) + CAST(T_Customer.Sort_Type[Value1] AS VARCHAR(10)) + REPLICATE('0',10 - LEN(T_Customer.Sort_Type[Value2]) + CAST(T_Customer.Sort_Type[Value2] AS VARCHAR(10)) + REPLICATE('0',10 - LEN(T_Customer.Sort_Type[Value3]) + CAST(T_Customer.Sort_Type[Value3] AS VARCHAR(10)) WHERE T_Customer.Customer_ID = T_Task.Customer_ID
...最多T_Customer.Sort_Type [Value5]。
提醒:这些值根本不是常量,所以值是 字段MySort必须在打印报告之前不断更新。 这个想法是以某种方式消除了不断更新领域的需要, 而是将字符串作为结果集的一部分返回。
结果字符串的长度应始终为50个字符。一世 这里没有做到这一点只是为了节省一点空间和时间 - 我选择了 这个例子只有3个。真正的字符串只会有另一个 20个零引导价值: ' 00000000000000000000002017010100000000010000012345'