一个函数或多个函数用于在多列连接表上进行双向查找?

时间:2015-05-01 15:41:58

标签: sql-server

在SQL Server中,我们有一个联结表,将我们的属性ID与几个外部数据库中相同属性的ID(文本或数字)相关联(对于没有链接,标记值为-1或“-1”):

SEPID    SEPCODE   AEID     MRIID    ABSID  PEDID
 2087   '140800'  26077  '140800'     '-1'   3162
 2088   '140900'     -1  '140900'     '-1'   3167 
 2089   'F21610'  25744      '-1'     '-1'   3184
 2090    '15402'     -1      '-1'     '-1'   3185
 2094   '141200'  26085  '141200'  '83296'   3198

随着数据库和业务需求的增长,我们编写新的特定函数来将一组ID转换为另一组ID,以逗号分隔的输入ID字符串列表并返回输出ID表或另一个以逗号分隔的输出列表ID,具有表值(TVF)与标量值(SVF)函数的不同用例。例如(使用硬编码而不是正常的以编程方式管理的ID列表):

SELECT * FROM dbo.tvf_SepIdsToAbsIds('2088,2090,2094')
SELECT * FROM dbo.tvf_MriInfo(dbo.svf_AeIds2MriIds('26077,25744'))

将返回:

ABSID
'-1'
'-1'
'83296'

MRIID     NAME    ETC...
'140800'  'Foo'   ...

我想知道是否有一种合理,实用,合理的方式来替换这些激增的特定功能,只需要一个通用的TVF和SVF,它将带有两个列名和一个ID列表:

SELECT * FROM dbo.tvf_Ids('SEPID', '2088,2090,2094', 'ABSID')
SELECT * FROM dbo.MriInfo(dbo.svf_Ids('AEID', '26077,25744', 'MRIID'))

有可能吗?它需要动态SQL吗?有时文本/有时数字外部ID是否会使事情变得复杂化?这场斗争值得吗?动态SQL总是感觉有点狡猾,在这种情况下,我甚至不确定如何编写它。

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你就会拥有许多数据库,每个数据库都掌握一组ID。在您选择的数据库中,您将一些\所有这些与本地数据相关联。然后,您需要一种在本地\远程IDS之间进行转换的方法。

您可以使用同义词指向数据库,然后使用视图来使用您的同义词。

所以你会有

Select *
from MyNewView

并在你的MyNewView

Select *
from MyNewSynonym s
inner join Mytable.ABSID = s.ABSID

您的本地数据只是查看视图,并且不了解有关不同数据库或任何特定转换问题的任何信息。它全部隐藏在同义词和视图中。

不确定为什么要使用TVF,但它们比使用SVF更好,因为性能原因你肯定要避免使用它们。如果你可以在视图中隐藏它,那就更好了,因为它可以为你提供索引优势。

至于拆分字符串并将它们转换为行集,您可以使用许多方法来执行此操作。包括TVF,CLR功能或一些可怕的循环。有很多例子可以帮助你。然后,您只需将结果与上面视图中的结果一起加入。