Tsql 将Navision筛选器转换为SQL,其中

Tsql 将Navision筛选器转换为SQL,其中,tsql,filter,navision,dynamics-nav,Tsql,Filter,Navision,Dynamics Nav,我在表格中有一个字段,格式为1_2..1_10 | 1_6 | 1_8 |,其中1_2..1_10包括1_2,1_3和其他 如何选择数据,其中number=1_3?第一个建议:获得修改数据库结构的权限,并找出如何更好地存储导航字符串 第二个建议:CLR 我假设您对这些概念都比较熟悉。如果你不是,它们在网络上都有很好的文档记录 我的方法是使用CLR函数,因为在SQL中会有一些高级的东西很难用C#处理。psuedo的穿行路线是这样的 实施 创建CLR函数并在SQL server实例上实现它 使用SQ

我在表格中有一个字段,格式为
1_2..1_10 | 1_6 | 1_8 |
,其中
1_2..1_10
包括
1_2
1_3
和其他


如何选择数据,其中
number=1_3

第一个建议:获得修改数据库结构的权限,并找出如何更好地存储导航字符串

第二个建议:CLR

我假设您对这些概念都比较熟悉。如果你不是,它们在网络上都有很好的文档记录

我的方法是使用CLR函数,因为在SQL中会有一些高级的东西很难用C#处理。psuedo的穿行路线是这样的

实施

  • 创建CLR函数并在SQL server实例上实现它
  • 使用SQL resultset更改查询以基于navision筛选器值(其中为“1\u 3”)查找CLR函数的返回值
  • CLR功能逻辑

    SELECT Field1,Field2...CLRFunctionName(FilterValue) AS FixedFilterValue FROM Sometable WHERE FixedFilterValue LIKE '%1_3%';
    
  • 创建一个c#函数,该函数接受筛选器字段的值并返回字符串值
  • CLR函数通过|字符将过滤器字段拆分为一个列表
  • 在CLR函数中创建第二个列表。迭代第一个列表。当您发现一个范围内的字符串时,将其拆分到“.”上,并手动将该范围内的所有可用值添加到第二个列表中。当你发现一个不在范围内的值时,只需将它添加到第二个列表中
  • 将第二个列表的内容连接到“|”字符表上
  • 返回连接的值
  • SQL逻辑

    SELECT Field1,Field2...CLRFunctionName(FilterValue) AS FixedFilterValue FROM Sometable WHERE FixedFilterValue LIKE '%1_3%';
    

    你不能改变数据库结构吗?这一个特别糟糕…我会注意到我考虑在SQL server中使用函数,但我认为每行函数调用中的临时表数量会对性能造成更大的影响。C#和.NET应该比SQL Server更快地处理这种迭代式思维过程。在开始本说明之前,请注意CLR很难正确实施,一旦实施,就很难维护。还有一个说明。如果您的数据库很大,请不要急于获取此查询。这将是相当缓慢的。正如我所说的,最好的办法是找到某种方法,使navision过滤器与SQL更容易理解的东西配对。